Jmeter系列之测试计划、线程组、采样器(一)

基于Jmeter5.2.1

熟悉Jmeter,从熟悉Jmeter元件开始,这篇将记录测试计划、线程组、采样器这三个元件。

测试计划(Test Plan)

本次测试的所有内容都是基于一个测试计划的,意思是其他元件都会在测试计划下。
Jmeter系列之测试计划、线程组、采样器(一)

1 : 测试计划的名称和注释,名称建议是能表达这个脚本的作用的。
2: 用户定义的变量:在这里定义的变量,相当于全局变量,一般用来添加一些系统常用的配置。
3 : 测试计划下可以包含多个线程组,线程组之间可以是并行执行,也可以是顺序执行,如果勾选了该选项,表明多个线程组之间是顺序执行的,不勾选表示多个线程组之间是并行执行。
举例:
Jmeter系列之测试计划、线程组、采样器(一)
勾选:线程组1一定在线程组2之前执行
不勾选:线程组1和线程组2并行执行
4 : 默认勾选,表示无论什么情况,都会运行tearDown线程组,后续在 线程组部分 做详细说明。
5 : 勾选后,Jmeter会保存每次的请求结果,同时下面有句说明:勾选后可能对性能测试产生不利影响。
6 : 添加目录或jar包到classpath中,常用于需要调用外部jar包的情况下。比如脚本中需要调用commons-lang-2.6.jar,那可以在这里添加jar包,在可编写代码的元件中类似java程序一样直接import该jar包即可。

线程组

一个测试计划下可以有多个线程组,线程组是测试计划的开始。Jmeter有三种类型的线程组,名字不一样,但是创建之后,界面是完全一致的。
Jmeter系列之测试计划、线程组、采样器(一)

setUp Thread Group

一种特殊类型的线程组,用于在执行常规线程组(Thread Group)之前执行一些必要的操作,这个线程组下的线程行为与常规线程组完全一致,不同的是执行顺序,它会在常规线程组执行之前被触发。
应用的场景主要有:

测试数据库操作功能时,用于执行打开数据库连接的操作
测试依赖用户登录的接口时,用于执行用户登录,获取token的操作

tearDown Thread Group

一种特殊类型的线程组,用于在常规线程组完成后执行一些必要的操作,这个线程组下的线程行为与常规线程组完全一致,不同的是执行顺序,它会在常规线程组执行之后被触发。
应用的场景主要有:

测试数据库操作功能时,用于执行关闭数据库连接的操作
测试依赖用户登录的接口时,用于执行用户登出的操作

Tread Group

平常使用的最多的线程组,下面介绍线程组的各个参数。
Jmeter系列之测试计划、线程组、采样器(一)

1 : 线程组的名称和注释

2 : 采样器错误后执行的动作:

Continue:忽略错误,继续执行
Start Next Thread Loop:忽略错误,线程当前循环终止,执行下一个循环
Stop Thread:当前线程停止执行,不影响其他线程正常执行
Stop Test:整个测试会在当前正在执行的线程执行完毕后停止
Stop Test Now:整个测试会立即停止执行,当前正在执行的采样器可能会被中断


这几个取值结合测试计划的 Run tearDown Thread Group after shutdown of main threads参数 ,当取值是Continue、Start Next Thread Loop、Stop Thread时,这个参数即使不勾选,也是会执行tearDown线程组,当取值为Stop Test、Stop Test Now时,这个参数需要勾选,才会执行tearDown线程组。

3 : 设置线程数,可以理解为并发数,每个线程可以认为就是一个虚拟用户,即多个用户同时去做同一个操作。线程之间是互不影响的,线程A中修改的变量值,不会影响到线程B。

4 : 设置启动所有线程所需要的时间
比如,线程数设置为5,启动所有线程所需要的时间设置为5,每个线程将在前一个线程启动后1秒(5/5)后启动。

假如线程数设置为1000,启动所有线程所需要的时间设置为1,说明要在1秒内启动1000个线程,这样对个人电脑负荷还是挺大的,所以一开始可以将启动所有线程所需要的时间设置为等于线程数,后续再根据电脑配置慢慢调整,总不能线程数为10000,而我需要等待1万秒。

5 : 设置线程组内每个线程执行的次数
线程数设置为5,每个线程执行的次数设置为2,意思是5个线程各执行2次,相当于执行了10次。
如果勾选了Infinite,那线程就会永远运行下去。
我个人不怎么使用这个参数,更多的是设置线程数。

6 : 每次迭代使用相同的线程,即线程复用
这里跟HTTP Cookie Manager中的一个参数紧密关联,后续详解,目前不了解作用也是可以的,默认勾选即可。

7 延时创建线程直到需要:勾选后,只有需要线程了才会创建

8 : 指定线程寿命
Duration(seconds):持续时间,设置线程组运行多长时间,单位是秒,跟线程数和每个线程运行次数配合使用,即使线程数和线程运行次数还未跑完,持续时间到了,线程组直接停止。
从bin/jmeter.log中也找到一条日志:
Jmeter系列之测试计划、线程组、采样器(一)

Startup delay(seconds):设置线程启动延时时间,是指多少秒后才开始启动线程,不是说每个线程都延迟多少秒启动。

需要注意:勾选指定线程寿命(Specify Thread lifetime)后,可以只设置Duration,不设置Startup delay,但不可以不设置Deration,而只设置Startup delay,因为Duration不设置的话默认是0,持续时间为0的话那线程组也不用启动了。
线程组设置:
Jmeter系列之测试计划、线程组、采样器(一)
日志bin/jmeter.log:
Jmeter系列之测试计划、线程组、采样器(一)
可以看到第一个线程1秒后才启动。
如果需要控制每个线程都是隔1秒启动,比如第1个线程第1秒后启动,第2个线程第2秒后启动,可以设置如下:
Jmeter系列之测试计划、线程组、采样器(一)
不过感觉控制这个没什么必要,至少我目前用不上。

采样器

Jmeter的采样器有很多种,由于篇幅问题,本节先介绍最常用的HTTP Request Sampler的基本使用,下一节再详细介绍HTTP Request采样器的高级使用和其他采样器。
![屏幕快照 2020-03-09 下午10.08.19.png](https://imgconvert.****img.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNDQ0MDgwLzE1ODM3NjI5NTQ1MzktMDUzODBjMDUtMmFlOC00M2ExLTk3MjktNDZhOTkyYjk3NDRhLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=280&name=屏幕快照 2020-03-09 下午10.08.19.png&originHeight=280&originWidth=1410&size=112380&status=done&style=none&width=1410)

![屏幕快照 2020-03-09 下午10.09.34.png](https://imgconvert.****img.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvNDQ0MDgwLzE1ODM3NjM1NDUzMDctNjNkYmVmYjUtNGZkMy00ZDY1LWFjZWEtZjNkYzI5MjQ3OWNiLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=1288&name=屏幕快照 2020-03-09 下午10.09.34.png&originHeight=1288&originWidth=1684&size=140386&status=done&style=none&width=1684)

1 : 名称和注释
2 : 请求协议,可以填HTTP、HTTPS、FILE,默认为HTTP
3 : 域名或IP地址,不包括HTTP://前缀,可以分以下三种情况填写域名或IP地址:

HTTP Request Defaults中填写Server Name of IP,利于向同一个域名发送大量请求的场景
HTTP Request Sampler中填写Server Name of IP,如果只是访问一个接口,那直接在这里填写就可以了
Path字段中填写,举例://www.ym.com/api/login、https://www.ym.com/api/login或http://www.ym.com/api/login

4 : Web服务监听的端口,HTTP默认端口80,HTTPS默认端口443

5 : 请求方法,常用GET、POST、DELETE、PUT等。

6:要请求的接口路径,可以有以下几种:

https://www.ym.com/api/login,这种情况下会忽略server、port、protocol的值
同时也会忽略GET、DELETE请求的parameters(数字9部分)的值
说明GET、DELETE请求一旦在path填了全接口路径,那么也需要将请求参数一起拷贝到path,比如GET https://www.ym.com/api/get?no=123
//www.ym.com/api/login,这种情况下不会忽略任何参数
/api/login,配合protocol、port、server Name or IP使用, 建议这种

7: 要使用的内容编码,适用于POST、PUT、PATCH这三种请求方法,即对Body Data部分(数字10部分)编码,要注意这里的Content encoding不是HTTP Header的Content-Encoding

8
Jmeter系列之测试计划、线程组、采样器(一)

9:如果是GET,DELETE请求,参数会附加到请求URL,如果是POST、PUT请求,则会以application/x-www-form-urlencoded的方式发送请求
Jmeter系列之测试计划、线程组、采样器(一)
如果参数包括一些特殊字符,比如’&’,那就需要勾选URL Encode,Content-Type和Include Equals保持默认即可,Include Equals只有在Value字段为空才可以取消勾选,但实际我没看出有什么作用。

10 :主要用来传请求参数为json格式的参数,同时也需要在Header中配置Content-Type为application/json

11:上传文件
Jmeter系列之测试计划、线程组、采样器(一)

File Path 要发送的文件名,如果保留为空白,则Jmeter不发送文件
Parameter Name 请求参数名,和接口的请求参数名一致
MIME Type MIME类型

Jmeter系列之测试计划、线程组、采样器(一)