实验简介
在前面的学习中,我们已经利用JMeter完成了针对Agileone系统的协议级接口测试。我们也知道,性能测试技术的核心便是利用多线程技术发送协议请求,完成对大量用户访问系统的模拟。而JMeter的设计初衷其实就是为了性能测试,比如我们创建一个测试计划的第一步便是创建一个线程组。本实验就为大家讲解如果利用JMeter完成对Phpwind的登录和发帖的性能测试。
实验目的
(1) 掌握JMeter中的关联查找的用法。
(2) 掌握JMeter中的线程设计及用法。
(3) 掌握JMeter中的测试报告的用法。
实验流程
实现Phpwind的登录取样器
我们已经为Phpwind创建了从testuser_1到testuser_100共100个用户,那么在性能测试过程中,我们应该实现用户的随机登录,这样更能模拟真实场景。
(1) 创建一个"HTTP请求"取样器,并命名为"DoLogin",填写好对应的登录的POST请求参数。
(2) 为该取样器创建"响应断言"和"察看结果树",后续请求同。
(3) 为该取样器创建一个"前置处理器",并实现一个从1到100的随机数。
(4) 最终实现的测试请求如下:
2. 利用正则表达式关联验证码
由于在Phpwind中发帖时,必须指定一个字段"verify",该值是一个随机数,我们必须使用正则表达式关联响应中的对应的值。这部分在接口测试的实现过程中已经有所掌握,此处我们主要看看在JMeter中如何实现:
(1) 添加一个"HTTP请求"取样器,并发送GET请求给"/phpwind/post.php?fid=2"获取响应。
(2) 为该取样器添加一个后置处理器,设置为"正则表达式提取器",并为其进行如下设置:
(3) 对上述的几个输入字段简单做一个说明:
a) 引用名称:下一个请求要引用的参数名称,如填写verifycode,则可用${verifycode}引用它。
b) 正则表达式:圆括号包含的就是要提取的内容,这也是我们熟练应用的内容。
c) 模板:用-引用起来,如果我们设置的正则表达式查找到多个值,则序号表示处理哪一个值。
d) 匹配数字:0代表随机取值,1代表全部取值,通常情况下填0就好。
e) 缺省值:如果参数没有取得到值,那默认给一个值让它取。
3. 添加发帖请求
(1) 为该取样器设置一个用户参数,使用函数助手生成一个随机数,用为帖子标题和内容的随机数。
(2) 将上一步中获取到的verifycode作为POST请求正文verify字段的值。
(3) 最后生成的测试请求如下:
4. 确保每个请求下载全部资源
默认情况下,JMeter与接口测试一样,只负责当前请求页面的下载,而不会下载页面的其它附加资源,这显然是不符合真实情况的。所以我们需要下载页面的全部资源,在HTTP取样器中的"Advanced"标签页中,勾选"从HTML文件中获取所有包含的资源"即可。
5. 设计并发场景
本次执行我们仍然按照前面的Java脚本相同的场景设计:50个用户,每10秒钟并发5个用户,每个用户运行100次。具体设置如下:
上述设置中的"Ramp-Up Period(in seconds) "这个参数设置为100秒的意思是每两秒钟增加一个线程,虽然无法象自定义线程那样任意定义频率,但是这样的设置与每10秒钟并发5个用户的作用没有什么本质差别。
除了设置运行次数外,我们还可以设置性能测试过程的总运行时间。在上图的下部,勾选"调度器"并设置持续时间即可。如我们需要持续运行一个小时,则只需要设置其值为3600秒即可。
6. 为每一步设置思考时间
思考时间是为了模拟真实的用户场景所必需的设置。JMeter为我们提供的"定时器"组件便是用于模拟用户的思考时间的,JMeter自带的定时器类型较多,我们以比较常用的"高斯随机定时器"我们可以按照如下步骤在JMeter中一个取样器设置思考时间:
(1) 右键某个取样器,比如我们点击"DoLogin",新建一个"高斯随机定时器"。
(2) 设置偏差为2000毫秒,固定延迟偏移为4000毫秒。其作用就是产生一个4秒正负2秒范围内的随机数,即随机暂停时间为2秒~6秒之间。
更多关于JMeter定时器的用法
7. 设置集合点
集合点这一概念最早是由LoadRunner这款性能测试工具提出来的,其作用是当一组线程发送完请求后,大家一起集合,直到所有线程都同步到一个时间点后,再一起发送请求。用于模拟更严格的并发测试,集合点的使用虽然不太符合真实场景,但是却可以给服务器施加更大的瞬时压力,主要用于对服务器进行并发测试。
在JMeter中,我们可以使用"Synchronizing Timer"定时器来完成集合点的处理。比如下图为我们演示了如何为取样器"DoPost"实施并发测试策略:
(1) Number of Simulated Users to Group by:该值对应的是集合点的线程数量,此处我们设置为50,表示一次集合需要等齐50个线程后才一起发送下一次请求。如果此处设置为0,则表示使用线程组设置的所有线程集合。
(2) Timeout in milliseconds:此处设置为10000,表示集合点的超时时间为10秒钟,即如果10秒钟还没有等齐所有线程,则不再等待。已经完成集合的线程直接发送下一次请求。
事实上,在Java的原生线程开发中,我们也可以使用"wait()"和"notifyAll()"两个同步方法完成集合点的模拟。
8. 查看性能测试结果
JMeter当中也内置了很多查看测试报告的组件,但是我们比较常用的就是为某个线程组创建的"聚合报告",比如当前Phpwind的性能测试运行后的结果如下图所示:
我们可以从上图中看到每一个取样器的执行次数,响应时间的各种数学统计(平均数,中位数,90%值,最小值,最大值),事务的错误率,网络带宽的吞吐量,总的响应大小,总的请求大小等数据。除了对服务器端的性能指标进行监控外,基本上这些指标已经足够我们对一次性能测试进行基础数据的分析了。
思考练习
(1) 熟悉JMeter中其它组件的用法。
(2) 利用JMeter完成一个项目的性能测试,并将遇到的问题逐一解决。
(3) 将JMeter中的性能测试与我们用原生Java自己开发的性能测试作比较,看看有何异同。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。