✏️作者:银河罐头
📋系列专栏:JavaEE
🌲“种一棵树最好的时间是十年前,其次是现在”
目录
- 一、项目背景
- 二、项目功能
- 三、测试计划
- 一)功能测试
- 二)自动化测试
- 三)性能测试
- 编写性能测试脚本
- 创建测试场景(Controller)
- 生成测试报告(Analysis)
一、项目背景
个人博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有 8 个页面构成:注册页,登录页,个人信息页,写博客页,博客详情页,修改博客页,博客列表页,个人博客列表页。其结合后端实现了以下的主要功能:注册、登录、查看个人信息及修改、写博客、修改博客、注销、删除博客、密码加盐、验证码校验、查看所有人博客、查看个人博客、博客列表分页、redis存储session、拦截器验证是否登录、博客评论等功能。
二、项目功能
1.注册功能:用户在输入用户名,密码,确认密码后。参数合法情况下注册成功,跳转到登录页。
2.登录功能:注册的用户名密码已经在后端写入了数据库。用户名,密码,验证码三者都校验成功后会跳转到个人博客列表页。登录失败会提示错误。
3.博客列表页:已登录用户和未登录用户都能看到所有人写的博客。支持分页功能。
4.评论功能:只有已登录用户才有查看评论和写评论权限。博客归属人有权删除自己博客下的评论。
5.修改博客功能:修改成功后会跳转到个人博客列表页
6.删除博客功能:删除博客成功后会刷新当前页面(个人博客列表页)
7.新增博客功能:新增博客成功后会刷新当前页面(个人博客列表页)
8.个人信息页:已登录用户可以查看自己的头像,昵称。同时有权修改头像,昵称,密码。
9.注销功能:注销成功后跳转到博客列表页。
10.文章详情页:显示文章标题,正文,作者,阅读量,发布时间,评论列表。左侧显示当前登录用户的信息(头像,昵称,文章总数)
11.个人博客列表页:已登录用户可以查看文章,修改文章,删除文章,写博客,个人中心,注销,查看所有人文章。
三、测试计划
一)功能测试
1.测试用例:
2.实际执行测试的部分操作步骤/截图
1)正常登录
登录成功后跳转到个人文章列表页。
2)正常注册
3)博客列表页
查看某一篇文章详情:
验证分页功能:
4)博客详情页
评论功能:
5)博客编辑页
回到个人列表页可以看到新发布的博客:
6)个人资料页
修改头像:
二)自动化测试
自动化测试参考:
自动化测试
三)性能测试
我们使用三个工具针对我们的项目进行性能测试。
a)Virtual User Generator(简称VUG): 用来生成性能测试脚本。
b)Controller: 创建测试场景,运行和监控场景。
c)Analysis: 生成测试报告,分析性能测试结果
性能测试步骤:
a)访问博客登录页;
b)执行登录;
c)进入个人博客列表页.
编写性能测试脚本
1.创建项目
操作步骤为:1.打开网页,2.输入账号密码验证码并登录;
在此期间,为了更好的让我们进行性能测试的数据收集,我们可以使用
事务: 衡量性能的重要指标,通过观察每秒事务通过数来衡量性能;
集合点: 让所有的虚拟用户执行到集合点时断在集合,满足条件后一起执行下一个步骤(保证每一个虚拟用户同时执行下一步);
参数化: 通过提供的数据源可以实现多个参数逐个执行;
Action()
{
//开启事务1
lr_start_transaction("index_trans");
//1.访问登录页面
web_url("login.html",
"URL=http://8.130.106.169:8080/login.html",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTML",
EXTRARES,
"Url=/image/47e9aa94-f21c-4a75-84a8-54b8f7ff7b63.png", ENDITEM,
"Url=/login.html", ENDITEM,
LAST);
lr_think_time(28);
web_custom_request("getcode",
"URL=http://8.130.106.169:8080/user/getcode",
"Method=POST",
"Resource=0",
"RecContentType=application/json",
"Referer=http://8.130.106.169:8080/login.html",
"Snapshot=t8.inf",
"Mode=HTML",
"EncType=",
LAST);
/* Added by Async CodeGen.
ID=Poll_0
ScanType = Recording
The following URLs are considered part of this conversation:
http://8.130.106.169:8080/user/login
TODO - The following callbacks have been added to AsyncCallbacks.c.
Add your code to the callback implementations as necessary.
Poll_0_RequestCB
Poll_0_ResponseCB
*/
web_reg_async_attributes("ID=Poll_0",
"Pattern=Poll",
"URL=http://8.130.106.169:8080/user/login",
"PollIntervalMs=9100",
"RequestCB=Poll_0_RequestCB",
"ResponseCB=Poll_0_ResponseCB",
LAST);
//登录的集合点
lr_rendezvous("login_rendezvous");
//开始事务2
lr_start_transaction("login_trans");
web_submit_data("login",
"Action=http://8.130.106.169:8080/user/login",
"Method=POST",
"RecContentType=application/json",
"Referer=http://8.130.106.169:8080/login.html",
"Snapshot=t10.inf",
"Mode=HTML",
ITEMDATA,
"Name=username", "Value={username}", ENDITEM,
"Name=password", "Value=123", ENDITEM,
"Name=checkCode", "Value=taqa6", ENDITEM,
LAST);
//结束事务2
lr_end_transaction("login_trans", LR_AUTO);
//结束事务1
lr_end_transaction("index_trans", LR_AUTO);
return 0;
}
参数化
支持输入多个账号
脚本测试通过。
分析日志:
创建测试场景(Controller)
针对我们已经编写好的脚本打开controller工具,创建测试脚本
生成测试报告(Analysis)
在 controller 创建的场景中直接生成测试报告,如下:
1.虚拟用户运行图:
作用:通过显示的虚拟用户数量可以判断出哪个时间段服务器负载最大(上图00:40 ~ 01:40负载最大)。
2.点击数图(每秒点击率)
作用:通过点击率可以判断出某时间段内服务器的负载。
3.吞吐量图
问题一:为什么吞吐量图和点击数图相似,但是吞吐量图要滞后一点?
因为吞吐量表示的是响应返回的资源数量,肯定是先有请求再有返回。
问题二:如果请求变多但是吞吐量没变化,原因是什么?
服务器响应太慢,来不及反应;
压力没有到服务器;
服务器设计一定的阈值(到达阈值以后,虽然也收到了请求,但是服务器不会做任何处理),保证了服务器不会因为并发量过大而出现宕机的情况;
4.事务图
5.平均事务响应时间图