欢迎来到末日幸存者的博客

使用Jmeter进行并发测试

一、技术详述

  • 本篇博客是对《软件工程实践总结&个人技术博客》这篇博客第二部分内容的展开。

  • 该技术的用途在前面的博客中有提到,主要用于web端压力测试,模拟多用户同时在线并发发出请求的场景,如100个用户同时查询某篇文章。

  • 阅读本篇博客首先需要对Jmeter有一定的了解,Jmeter的下载安装可以参考这篇文章《JMeter下载安装及入门教程》,这里不再赘述。下面就开始介绍如何用Jmeter进行并发的压力测试。

1.1 添加线程组

图片1

  • 在测试计划中添加一个线程组test,设置用户数,将Ramp-up period设为0。

1.2 添加Http请求

图片2

  • 在test中添加一个HTTP Request “Login”,填写必要的数据,如上图。本篇博客中所用的请求都比较简单,数据主要以Paramters的方式传递。

1.3 添加Listener

图片3

  • 给线程组test添加View Results Tree作为Listener( 添加其它的也可以,个人感觉这个比较好用 ),以及View Results in Table( 主要是为了讲述方便 )。

1.4 运行并查看结果

图片4

  • 查看View Results Tree,点开一个请求,设置数据格式为JSON( 我们组的项目返回的数据格式主要是JSON ),可以看Response Body的数据如图。

图片5
查看View Results in Table,可以看到每个请求开始的时间是一致的,可见实现了并发。


以上便是实现单个请求并发的方法。那么问题来了,如果一个线程组有多个请求该如何并发呢?

1.5 添加多个请求并添加Synchronizing Timer

图片6

  • 如上图在test中又添加了一个请求“InquiryStudentList”,并给其添加响应断言Response Assertion( 判断请求是否返回数据,没有的话视为不通过 )。

图片7

  • 给test添加Synchronizing Timer,设置保持默认就好,其中Number of Simulated Users to Group by即每次释放的线程数量( 0等同于设置为线程租中的线程数量 )。添加完成后便可以使得线程组中的每个请求并发执行,即请求A并发执行,然后请求B再并发执行。

  • 执行的结果如下:
    图片8
    图片9
  • 可以看到,Login请求并发执行完毕,InquiryStudentList请求才开始并发执行。

然而,上述请求仅在不需要身份认证的情况下,才能通过,而身份认证则需要在请求头中添加token。也就是说需要先登录获取用户的token,鉴于token每次登录都是不同的,而且一个用户只对应一个token,需要提取登录返回的token,并将其设为全局变量。

1.6 提取token并设为全局变量

图片10

  • 这边更改test的设置,使得其只包含Login请求,并将线程数置1。给Login请求添加JSON Exactor( 登录返回JSON类型的数据 )用于获取返回数据中的token。

图片11

  • 为Login请求添加BeanShell PostProcessor,将token设置为全局变量。

图片12

  • 给测试计划添加HTTP Header Manager,将token变量加入,使得该测试计划中的其他线程组都可以获得这个token。

图片13

  • 在测试计划中添加需要测试的线程组( 并发数自行设置 ),与之前不同的是该线程组添加了新的Listener“Aggregate Report”。且线程组中的请求都需要token才能通过。

图片14

  • 更改测试计划的设置,确保每个线程组顺序执行,即保证token能够起作用。

图片15
图片16

  • 运行测试,由上面两张图片可以看出确实将token提取出来并包含在请求中。

二、问题与解决

  • 技术使用倒是没有什么问题,主要的问题是学习使用的过程中的问题。大概有以下两点:

1、没有将token设为全局变量

我之前并未考虑将登录单独设为一个线程组( 因为先前只知道如何提取token ),而是每个线程组都设置一个登录请求,且每个线程组都有一个请求头管理器,但是这样的话就会使得登录请求返回的token多次被覆盖,因为线程组含多个线程,每个线程都得登录一次,而之前有提到一个用户一次只能用一个token。所以,这样做是行不通的( 指并发的情况,如果循环就可以 ),而且每个线程组都得设置个登录,太多余了。

2、没有令测试计划中的线程组顺序运行

也就是说虽然单独设置了登录的线程组,但并没有保证其是先运行的,也就是token还没提取,其它线程组就已经在执行了。即前面提过的token失效的问题。

三、总结

posted @ 2021-06-25 21:27  阮宫筱白  阅读(1310)  评论(2编辑  收藏  举报