使用Jmeter进行并发测试
一、技术详述
-
本篇博客是对《软件工程实践总结&个人技术博客》这篇博客第二部分内容的展开。
-
该技术的用途在前面的博客中有提到,主要用于web端压力测试,模拟多用户同时在线并发发出请求的场景,如100个用户同时查询某篇文章。
-
阅读本篇博客首先需要对Jmeter有一定的了解,Jmeter的下载安装可以参考这篇文章《JMeter下载安装及入门教程》,这里不再赘述。下面就开始介绍如何用Jmeter进行并发的压力测试。
1.1 添加线程组
- 在测试计划中添加一个线程组test,设置用户数,将Ramp-up period设为0。
1.2 添加Http请求
- 在test中添加一个HTTP Request “Login”,填写必要的数据,如上图。本篇博客中所用的请求都比较简单,数据主要以Paramters的方式传递。
1.3 添加Listener
- 给线程组test添加View Results Tree作为Listener( 添加其它的也可以,个人感觉这个比较好用 ),以及View Results in Table( 主要是为了讲述方便 )。
1.4 运行并查看结果
- 查看View Results Tree,点开一个请求,设置数据格式为JSON( 我们组的项目返回的数据格式主要是JSON ),可以看Response Body的数据如图。
查看View Results in Table,可以看到每个请求开始的时间是一致的,可见实现了并发。
以上便是实现单个请求并发的方法。那么问题来了,如果一个线程组有多个请求该如何并发呢?
1.5 添加多个请求并添加Synchronizing Timer
- 如上图在test中又添加了一个请求“InquiryStudentList”,并给其添加响应断言Response Assertion( 判断请求是否返回数据,没有的话视为不通过 )。
- 给test添加Synchronizing Timer,设置保持默认就好,其中Number of Simulated Users to Group by即每次释放的线程数量( 0等同于设置为线程租中的线程数量 )。添加完成后便可以使得线程组中的每个请求并发执行,即请求A并发执行,然后请求B再并发执行。
- 执行的结果如下:
- 可以看到,Login请求并发执行完毕,InquiryStudentList请求才开始并发执行。
然而,上述请求仅在不需要身份认证的情况下,才能通过,而身份认证则需要在请求头中添加token。也就是说需要先登录获取用户的token,鉴于token每次登录都是不同的,而且一个用户只对应一个token,需要提取登录返回的token,并将其设为全局变量。
1.6 提取token并设为全局变量
- 这边更改test的设置,使得其只包含Login请求,并将线程数置1。给Login请求添加JSON Exactor( 登录返回JSON类型的数据 )用于获取返回数据中的token。
- 为Login请求添加BeanShell PostProcessor,将token设置为全局变量。
- 给测试计划添加HTTP Header Manager,将token变量加入,使得该测试计划中的其他线程组都可以获得这个token。
- 在测试计划中添加需要测试的线程组( 并发数自行设置 ),与之前不同的是该线程组添加了新的Listener“Aggregate Report”。且线程组中的请求都需要token才能通过。
- 更改测试计划的设置,确保每个线程组顺序执行,即保证token能够起作用。
- 运行测试,由上面两张图片可以看出确实将token提取出来并包含在请求中。
二、问题与解决
- 技术使用倒是没有什么问题,主要的问题是学习使用的过程中的问题。大概有以下两点:
1、没有将token设为全局变量
我之前并未考虑将登录单独设为一个线程组( 因为先前只知道如何提取token ),而是每个线程组都设置一个登录请求,且每个线程组都有一个请求头管理器,但是这样的话就会使得登录请求返回的token多次被覆盖,因为线程组含多个线程,每个线程都得登录一次,而之前有提到一个用户一次只能用一个token。所以,这样做是行不通的( 指并发的情况,如果循环就可以 ),而且每个线程组都得设置个登录,太多余了。
2、没有令测试计划中的线程组顺序运行
也就是说虽然单独设置了登录的线程组,但并没有保证其是先运行的,也就是token还没提取,其它线程组就已经在执行了。即前面提过的token失效的问题。
三、总结
-
没啥好写的,给个流程图:
-
参考博文
jmeter--压力测试
jmeter全局变量配置