文章目录
做好准备的人一定会得到一颗糖!
一、项目背景
- 在线OJ,即在线的网页版编程平台,这在目前是比较常见的且常用的,如LeetCode以及牛客网等都是类似的在线OJ平台。
- 当打开该网站之后就可以看到很多算法题,然后你就可以完成在线做题、在线提交,并可以立即看到运行是否通过。
二、项目功能
该在线OJ项目主要实现了以下功能:
- 能够管理题目:保存很多题目信息,即 题干与测试用例
- 题目列表页:能够展示题目列表,即题目的序号、标题以及难度
- 题目详情页:能够展示某个题目的详细信息和代码编辑框等信息
- 提交并运行题目:详情页中有一个“提交”按钮,点击按钮之后网页就会把当前的代码提交到服务器上,服务器就会执行该代码,并给出一些是否通过测试用例的结果展示
- 查看运行结果:有另一个结果页面,能够展示上次提交的代码是否通过以及错误的用例信息。
三、测试计划
一)功能测试
-
测试用例
-
实际执行测试的部分操作步骤/截图
1)点击“项目链接”后正常跳转
2)在“列表页”点击题目标题之后会跳转到详情页
3)代码编辑框编写代码
4)提交代码并查看结果
二)自动化测试
1. 代码编写
- 添加相关依赖pom.xml
<dependencies>
<!-- 添加selenium依赖-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
<!-- 保存屏幕截图需要用到的包-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- 添加junit5依赖-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
-
新建common包
1)在该包下面存放的是公共类
2)新建公共类AutoTestUtils.java
① 创建驱动、保存现场截图
② 注意:在保存现场截图的时候命名是按时间来进行文件夹的划分的,然后图片的名称要体现出测试类的类名,方便进行问题的追溯。
③ 注意文件名的动态获取,注意时间格式的设置。
④ 注意:可以在创建驱动的时候修改默认的有头模式or无头模式(此处最后采用的是无头模式,在写代码的时候因为边写边检查所以可以先采用有头模式进行查看修改) -
新建tests包并在包下新建测试类
1)主页的“项目链接”点击跳转测试:HomeLinkTest.java
主要实现了一个测试用例,即点击“项目链接”后会跳转到Gitee页面,并检测该页面的元素来确认跳转成功。
2)列表页点击标题的跳转测试:ListTest.java
① 测试列表页是否正常显示,通过检查列表页的元素如编号、列表等元素来确定列表页的正确展示。
② 点击列表页的题目“标题”之后会跳转到详情页,同样通过检查页面的元素来确定跳转成功。
3)详情页提交代码测试:DetailTest.java
① 与主页类似的“项目链接”跳转测试
② 代码编辑框的检查以及空代码的提交,然后通过结果区内容与预期结果的对比还判断是否正确编译运行。(但是注意这里没有实现代码编辑以后再提交的测试)
4)驱动释放类:DriverQuiteTest.java
5)套件类:runSuite.java
@SelectClasses
注释中,类对象的顺序就是执行顺序。 -
问题及解决
1)在进行列表页点击标题测试过程中检查元素时一直失败
① 经过观察以及分析得知:是因为浏览器同时打开了两个窗口,在进行元素检查时是定位到了另一个窗口,导致元素无法检测到而测试失败。
② 解决:需要在点击跳转之后进行窗口的切换,然后再检查元素是否存在。
2)在详情页提交空代码时,点击提交之后,直接获取编译运行结果并断言结果是否相等,结果出错。
① 经过输出测试,发现如果在点击“提交”后不强制进行等待的话很可能会出现结果还没更新成功而获取到空字符串的情况;另外,断言结果是否相等过程中因为路径会变化,所以每次得到的结果是不同的,故无法使用相等来进行断言。
② 解决:在点击“提交”之后使用强制等待等待结果更新,然后在断言的时候不使用相等断言,而是判真断言,看结果是否包含预期的关键字符串。
3)在使用Suite套件进行运行时,会发现单独测试通过的用来会出现fail的情景,经过查看发现基本是添加了@Order注释的用例失败。
解决方法:在含有@Order的类的上面添加@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
2. 代码测试
测试用例全部通过,如图所示:
发现测试耗时有些长,说明性能还有优化的空间。
3. 代码参考
1)代码布局:
2)参考代码:
在线OJ自动化测试代码
三)性能测试
使用loadrunner进行简单性能测试:主要针对并发点击统一题目进行详情页的跳转以及编写代码后同时提交等功能进行简单的性能测试,检查其性能的稳定性以及抗压性。(这里仅实现详情页的跳转功能)
在实现的过程中,插入集合点以及事务等,并通过设置来实现用户的并发操作。
1. VUG测试
- 测试脚本
Action()
{
// 插入集合点
lr_rendezvous("detail_redezvous");
// 插入详情页的点击事务
lr_start_transaction("detail_trans");
// 插入登录后的检查点:在请求之前检查
web_reg_find("Text=Practice",
LAST);
// 直接跳转到详情页地址,相当于点击题目标题进行跳转
web_url("web_url",
"URL=http://140.210.201.164:8080/online_OJ/problemDetail.html?id=1",
"TargetFrame=",
"Resource=0",
"Referer=",
LAST);
lr_end_transaction("detail_trans", LR_AUTO);
return 0;
}
- 测试通过
2. 设置并发数量进行性能测试,并导出测试报告以及图表
-
设置10个虚拟用户,防止电脑崩溃(在Tools中设置)
-
在Controller中设置场景
-
开始运行,性能测试开始(运行中+结束截图)
在运行之前,添加系统资源的检测。
① 运行中
② 运行结束
3. 在Analysis中查看性能报告以及报表
-
报告
-
点击率
-
吞吐率
-
系统资源
-
分析系统资源
① 剩余的物理内存近85%,即使用了近15%的内存,对于简单的访问功能来说内存使用还是较高的,还有内存优化的空间。
② CPU利用率一致都是处于比较低的状态,即点击率对CPU利用率影响不大,所以CPU利用率还有提高空间。
③ 总之,该性能还有优化的空间。
测试小结
- 对于功能测试,该项目的主要功能如项目详情以及代码编写并提交运行是可以正确运行的,册俄式通过。
- 对于性能测试,CPU利用率不是很高,内存使用较高,还有优化的空间。