工具使用 | jmeter基础使用

工具使用 | jmeter基础使用

Cosmos 712 2022-06-13

jmeter基本使用

1、jmeter的安装与配置

JMeter是Apache软件基金会旗下的产品,它是纯JAVA开发的应用,可以用来做接口的功能测试,也可以用来做接口的性能测试,既可以在GUI上运行,也可以通过命令行运行。关键:运行JMeter需要先保证电脑上的JDK环境是正常的。
配置jmeter的默认语言
修改jmeter的配置文件jmeter.properties,改成如下:
image-1655085698955

2、jmeter的基本概念

1)测试计划

表示的是一系列描述步骤,可以由一个或者多个线程组构成,一个线程组又可以表示是一个业务流(功能)的实现;

2) 线程组

线程组是一个测试计划的开始点,在一个测试计划中的所有元件都必须在某个线程下。所有的任务都是基于线程组。

3)组件与元件

image-1655085708755
组件:比如取样器、逻辑控制器、前置处理器、后置处理器、断言、定时器、配置元件、监听器,统称jmeter的八大组件
元件:组件下的每个子菜单叫一个元件,每一类组件包括多个元件

4)线程组的配置

image-1655085715001
说明:
线程数:表示模拟的用户数,一个线程相当于一个用户,在接口的功能测试中,一般保持为1
Ramp-Up时间:表示启动上面配置的线程需要的时间,如果设置线程数为12,Ramp-Up时间为3,则表示在3s内完成12个线程的启动,相当于1s钟启动4个线程;如果Ramp-Up时间配置为0则表示同时启动所有线程;
循环次数:表示每个线程循环执行脚本的次数,如果线程数为m,循环次数为n,则下面的元件会执行m*n次
调度器:如果不勾选,则表示立即启动线程,如果勾选,则可以实现按需要启动线程,启动延迟表示延迟多少秒启动线程,持续时间表示持续运行下面的元件的时间(注意:只有当元件执行时间大于配置的持续时间时,才能看到效果)

5)setUp线程组与tearDown线程组

setUp线程组会在普通线程组执行之前执行,tearDown线程组会在普通线程组执行之后执行,如下例子中3个取样器的执行顺序是:请求注册接口2->请求注册接口1->请求注册接口3
image-1655085725418

6)多个线程组的执行顺序:

如果勾选了测试计划下的独立运行每个线程组,则多个线程组是按照上下文关系来执行(谁写在前面就先执行谁),如果没有勾选这个选项,那么所有线程组就是同时执行的。
image-1655085731225

7)一个线程组下的多个线程执行顺序:

默认情况下,所有线程是同时执行的,大家会争抢cpu资源,谁先抢到就看到谁先执行了。

8)100个线程循环1次和1个线程循环100次的区别:

100个线程循环1次相当于100个线程同时执行1次,这就是性能测试中的并发用户为100;1个线程循环100次相当于1个用户连续操作100次,这种情况服务器的压力比前者要小得多。

9)配置fiddler抓取jmeter的请求

方法:在测试计划下添加一个http请求默认值元件,在高级选项中配置代理服务器的ip和端口,ip就配置localhost,端口配置fiddler端口8888,这样所有的请求都会走fiddler,这样fiddler就可以抓包了。
image-1655085740643

3、jmeter的八大组件

3.1 取样器

取样器是jmeter的最核心的组件,其它组件都是围绕取样器工作的。
1)http请求元件
用jmeter发送一个GET请求
方法:选择请求方法为GET,在参数选项下填入请求参数和数据
image-1655085778417
用jmeter发送一个POST请求
方法1:选择请求方法为POST,在参数选项下填入请求参数和数据
image-1655085782918
方法2:选择请求方法为POST,在消息体数据中以key1=value1&key2=value2…的格式传入参数,同时通过http信息头管理器元件来配置http请求的信息头
image-1655085788702
配置Content-Type: application/x-www-form-urlencoded
image-1655085791821
发送一个POST请求,以JSON格式提交数据,需要在消息体数据下面填入JSON格式的参数,并用HTTP信息头管理器设置Content-Type为application/json
image-1655085797386
发送一个POST请求,以form-data方式提交数据,需要在HTTP请求页面勾选对POST使用multipart/form-data选项,并在参数下填入请求参数。
image-1655085820749
2)调试取样器
作用是实现调试jmeter脚本,通过调试取样器可以查看jmeter变量、jmeter属性以及系统属性
image-1655085824166

3.2 配置元件

1)http请求默认值
作用是给其作用域范围内的http请求元件配置默认请求参数,比如协议、服务器IP、端口、路径、代理等等,放的位置不一样,它的作用域是不一样的。
image-1655085832902
2)http信息头管理器
作用是配置http请求的请求头,比如User-Agent,Content-Type,Cookie等,放的位置不一样,它的作用域是不一样的。
image-1655085903512
3)http cookie管理器
作用是实现不同请求之间的cookie自动保存与发送,相当于浏览器可以自动保存和发送cookie一样,解决接口之间的cookie关联。
image-1655085907694
在http cookie管理器中,也可以手动添加cookie,当然除了http cookie管理器之外,还可以在http信息头管理器中添加cookie。
4)用户定义的变量
作用是定义变量,定义的变量可以在其它元件中调用,jmeter上调用变量的语法是:${变量名}
image-1655085913485
5)计数器
作用是实现在一个范围内的计数操作,把计数的结果保存为变量,保存的变量可以在其他元件中引用。当计数超出最大值,又会从起始值开始重新计数。
image-1655085918230

3.3 前置处理器

前置处理器是在取样器执行之前执行的,用于实现预处理操作。
1)用户参数
作用是可以定义一个变量,并赋多个值,然后在线程组中设置多个线程,每个线程取一组值。
image-1655085924361

3.4 后置处理器

后置处理器是在取样器执行之后执行的,最常用的功能是实现数据的提取。
1)正则表达式提取器
作用是从响应中利用正则表达式来提取内容,把提取到的内容赋值给一个变量供其他元件调用
image-1655085927600

3.5 逻辑控制器

1)循环控制器
作用是设置循环控制器下的元件的循环次数,如果有多个循环控制器嵌套,那么最里面的元件的循环次数等于所有循环控制器的循环次数相乘。除了循环控制器之外,还可以在线程组上设置循环。

image-1655085932846

3.6 定时器

1)固定定时器
作用是在代码中添加固定的等待时间

image-1655085936335

2)同步定时器
作用是实现线程的同步,可以配置模拟用户组的数量和超时时间,比如线程组有配置了50个线程,添加一个同步定时器配置模拟用户组数量为50,则表示要等到50个线程全部启动后再发送(执行),如果等不到,就按配置的超时时间来超时,超时时间为0表示不超时。通过同步定时器可以实现绝对并发操作,这也叫jmeter的集合点。

image-1655085947943

3.7 断言

1)响应断言
作用是从响应的正文中断言是否包含预期的字符串,如果包含就断言成功,不包含就断言失败。
image-1655085973651

3.8 监听器

作用是查看取样器的执行结果。

3.9 测试片段

测试片段的特点是它下面的元件默认是不执行的,经常用它来备份不执行的元件。
3.10 八大组件的作用总结
1)取样器实现各种请求;
2)配置元件的作用是配置取样器;
3)前置处理器的作用是在取样器执行之前完成预处理操作;
4)定时器的作用是在代码中设置等待或同步线程等;
5)后置处理器的作用是在取样器执行之后完成后处理操作;
6)断言的作用是实现取样器的断言操作;
7)监听器的作用是查看取样器执行和断言的结果;
8)逻辑控制器的作用是实现代码的逻辑控制。
3.11 八大组件的执行顺序
配置元件–》前置处理器–》定时器–》取样器–》后置处理器–》断言–》监听器;逻辑控制器是实现逻辑控制的,与其它组件不一样,不好与其它比较。

4、jmeter的逻辑控制器

1)if控制器

作用是实现条件判断,注意条件需要用__jexl3或者__groovy函数来表示,或者是引用一个布尔值的变量。
image-1655085981217

举例:
{__jexl3(3<5,result)}:使用__jexl3函数计算3<5表达式,并把结果赋值给变量result {__groovy(3<5,result)}:使用__groovy函数计算3<5表达式,并把结果赋值给变量result
{__groovy({a}100,result)}:使用__groovy函数计算变量a的值是否等于100,并把结果赋值给变量result
{__groovy("{c}"
“hello”,result)}:使用__groovy函数计算变量c的值是否等于字符串hello,并把结果赋值给变量result
字符串的判断,需要在调用变量的格式外面加引号,比如"${c}"

2)while控制器

作用是实现循环,当while后面的条件成立的时候,循环执行下面的元件,直到条件不成立就停止,条件需要填__jexl3/__groovy函数表达式。
__jexl3/__groovy函数表达式,使用方法与If条件类似,比如{__groovy({j}<5,result)}
image-1655086166745

如何控制while循环的循环次数?
While循环+计数器来实现控制循环的次数
While循环的条件
image-1655086184870
计数器
image-1655086188809
这种方式会多循环一次,原因是第一次循环前判断循环条件的时候,因为还没有启动计数器,所以不存在变量j,这时While控制器会默认条件是成立的,开始了第一次循环,相当于先循环了再开始计数,所以就多循环了一次。

3)ForEach控制器

作用是实现迭代一组变量的值,如下表示遍历变量number_1到number_10,把遍历得到的值赋给变量k,变量k又可以被其它元件调用。
image-1655086202871

4)仅一次控制器

作用是控制它下面的元件只会执行一次;
a. 如果仅一次控制器放在循环控制器下面,不管循环控制器循环多少次,仅一次控制器下的元件都只执行一次;
b. 如果仅一次控制器放在嵌套的多层循环控制器下面,仅一次控制器下的元件只会在最近一层循环控制器执行时执行一次,对其它循环控制器无效;
c. 如果在线程组中设置了多线程,仅一次控制器下的元件会在每个线程执行时都执行一次。

5)交替控制器

作用是实现在每次循环时交替执行它下面的元件,比如如下配置,如果要循环3次,那么执行顺序是调试取样器0——》调试取样器1——》调试取样器0——》调试取样器2——》调试取样器0——》调试取样器3
image-1655086247638

6)简单控制器

作用是实现对取样器的分组。

7)事务控制器

将一个功能的多个接口请求添加到事物控制器下,如果其中一个请求失败则整个事务控制器就会失败。
image-1655086260081

5、jmeter的参数化

方法1:通过CSV数据文件设置元件实现参数化

JMeter通过CSV文件实现参数化的方法:
1)把数据编辑到CSV文件中;
2)通过CSV 数据文件设置来读取CSV文件中的数据,赋值给变量,每一列赋值成一个变量;
3)在取样器中通过调用上一步定义的变量,来实现调用读取的数据;
4)通过循环控制器或线程组设置循环,或者是通过多线程来读取CSV中的每一行数据,传入到请求中。
CSV数据文件设置元件的使用
CSV数据文件设置元件的作用是读取csv或者txt文件中的数据,保存为变量,供其他元件调用。
image-1655086269411
文件名:选择csv文件,也可以选择txt文件;
文件编码:选择与文件实际编码一致的格式
变量名称:可以给csv文件的每一列定义变量名,如果csv文件中有表头,也可以不定义变量名,使用表头的名称作为变量名
忽略首行:在配置了变量名称的情况下,如果csv文件有表头,就需要选择True
分隔符:填入csv文件的实际分隔符
是否允许带引号:如果选择True,表示当csv文件中的数据带引号时会自动去掉引号再赋值给变量,如果选择False,表示当csv文件中的数据带引号时会把引号也作为数据的一部分赋值给变量
遇到文件结束符再次循环:选择True的话会在读取完数据最后一行后再从第一行重复读,选择False的话会在读取完数据最后一行后结束循环
遇到文件结束符停止线程:选择True的话会在读取完数据最后一行后会把线程停止。

方法2:通过__CSVRead函数实现参数化的步骤

步骤:
1)通过__CSVRead函数来读取csv文件的每一列,传入csv文件的路径及列的索引,比如${__CSVRead(C:\Users\Administrator\Desktop\24期\注册数据2.csv,0)}表示读取第1列;
image-1655086280982

2)在线程组中设置多线程来实现读取每一行的数据。注意事项:a. 该函数也支持读取txt文件;b. csv文件不能添加表头;c. csv文件的编码保持默认。

方法3:通过__StringFromFile函数实现参数化

__StringFromFile函数可用于从文本文件中读取字符串,这对于运行需要大量可变数据的测试很有用。每次调用时会从文件中读取下一行,第1次调用时读取第1行,第2次调用时读取第2行,读取完后再次调用又会读取第1行,依次循环。也可以实现多个文件的值获取。
__StringFromFile函数读取的是文件的一行,可以通过__split函数对读取的一行数据切片,得到想要的字段

6、jmeter的内置函数

__changeCase:作用是实现字符串的大小写转换

举例:
${__changeCase(Hello World,,)}:输出HELLO WORLD
${__changeCase(Hello World,LOWER,)}:输出是hello world
${__changeCase(hello world,CAPITALIZE,)}:输出是Hello world

__char:作用是实现ASCII码转字符

举例:
a~z的ASCII码:97~122
 A~Z的ASCII码:65~90 

__counter:作用是实现计数,从1开始以步长为1计数,与计数器元件作用类似
举例:${__counter(FALSE,getCounter)}

__CSVRead:作用是读取CSV文件的内容,一列一列地读

__dateTimeConvert:作用是实现时间格式的转换

举例:
${__dateTimeConvert(20210312 17:17:19,yyyyMMdd HH:mm:ss,HH/mm/ss MM/dd/yyyy,getTime)}:表示将格式为yyyyMMdd HH:mm:ss的时间转成HH/mm/ss MM/dd/yyyy格式的时间,并把返回赋值给变量getTime
${__dateTimeConvert(${__time(,)},,HH/mm/ss MM/dd/yyyy,)}:表示把当前时间转成HH/mm/ss MM/dd/yyyy格式返回

__intSum:作用是实现整数求和
举例:${__intSum(1,2,getSum)} ——》3 ${__intSum(1,2,4,getSum)} ——》7

__groovy和__jexl3函数:作用是实现计算布尔表达式的值,返回布尔值,通常用在if和while控制器中

__log:作用是实现日志的输出功能
举例:${__log(Connection Time Out,INFO,Network Exception,Check the network connection)}

__machineIP:作用是获取当前运行主机的ip地址
举例:${__machineIP()}

__machineName:作用是获取当前运行主机的主机名
举例:${__machineName()}

__P或__property函数:作用是获取jmeter属性的值,注意如果要获取jmeter变量的值,需要用${变量名}来实现

${__P(language,english)}
 ${__property(language,,)}:调用属性language的值

__setProperty函数:作用是增加或修改属性的值
${__setProperty(abc,111,)}:表示如果没有属性abc,就添加一个属性abc,设置它的值为111;如果有属性abc,就修改它的值为111

怎么实现跨线程组调用变量?

1)在线程组中定义的变量,默认是只能在当前线程组中使用,如果想在另外一个线程组中使用它,需要先把它设置成属性,在另外线程组中通过调用属性来实现调用,因为属性是全局的,可以在任意线程组中调用。
2)可以在测试计划下定义变量,这种变量默认就是全局的,可以随意实现跨线程组调用。
总结:
jmeter上调用变量的语法:{变量名} jmeter上调用属性的语法:通过函数__P或者__property来调用,比如{__P(language,)}表示调用属性language的值,$

怎么实现跨线程组调用变量?

思路:先调用__setProperty函数设置一个属性,属性的值赋值为变量的值,比如{__setProperty(getSum,{getSum},)},然后再另外一个线程组中通过__P函数来调用属性,比如${__P(getSum,)},这样就实现了变量的跨线程组调用;

__Random:作用是在一个范围内随机返回一个整数
举例:${__Random(10,100,getRandom)}

__RandomString:作用是随机出一个指定长度的字符串
举例:${__RandomString(6,abcdefghijk!@#1234,)}

__time:作用是获取系统的当前时间,可以自定义格式
举例:${__time(YMDHMS,)} ——》20210120-142158

__V:作用是实现变量的嵌套调用
举例:${__V(num${a},)} ,如果a等于1,表示调用变量num1的值

__split:作用是实现字符串的分隔,分隔后得到的结果会赋值给多个变量,供其他元件调用
举例:${__split(abcd\,ef\,d,result,\,)}

7、接口的关联

接口的关联通常有两种场景:cookie的关联和数据的关联
1)cookie的关联:指的是前面响应的cookie需要放到后面请求中发送给服务器,通过添加一个http cookie管理器来自动解决cookie关联的问题;

2)数据的关联:指的是前面响应的数据需要放到后面请求的参数中发送给服务器,解决方案是通过后置处理器来从前面的响应中提取数据,保存为变量,在后面请求中调用变量的值来实现数据的动态关联。
举例:WebTours登录接口的Cookie管理与数据关联
image-1655086313202

8、jmeter的后置处理器

1)正则表达式提取器

正则表达式语法:
 . 表示匹配1个任意字符
 \d 表示匹配1个数字
 \w 表示匹配1可以组成单词的字符,即:数字、字母、下划线、汉字等,不包括特殊符号、空白等
 \s 表示匹配1个空白字符
 + 表示匹配1个或多个前面的字符/内容
 * 表示匹配0个、1个或多个前面的内容
 ? 表示以非贪婪模式匹配,不加?表示以贪婪模式匹配
1)贪婪模式:默认是贪婪模式,表示在满足左右边界的前提下,做最长的匹配,找到最后一 个匹配的结果结束;
2)非贪婪模式:使用?表示非贪婪模式,意思是在满足左右边界的前提下,做最短的匹配,找到第一个匹配的结果结束;
() 表示匹配左右边界之间的内容,小括号两边就是边界
.+?和.*?:.+?表示以非贪婪模式匹配1个或多个任意字符,.*?表示以非贪婪模式匹配0个、1个或多个任意字符。
{m} 表示匹配m个前面的内容,比如ab{5}表示匹配a后面5个b
{m,n} 表示匹配m到n个前面的内容,比如ab{3,5}表示匹配a后面3到5个b
{m,} 表示匹配至少m个前面的内容,比如ab{3,}表示匹配a后面至少3个b

正则表达式提取器的配置说明:
image-1655086338156
要检查的响应字段:默认保持主体不变
引用名称:定义一个变量来保存正则表达式匹配到的内容
正则表达式:填入正则表达式
模板:表示选择第几个模板匹配到的内容赋值给变量,格式是nn表示第n个模板匹配到的内容,其中00表示把整个正则表达式匹配到的内容包括边界赋值给变量,注意选择的模板一定是在正则表达式中存在的
匹配数字:表示当正则表达式可以匹配多个结果时,选择哪一个结果赋值给变量,其中0表示随机
缺省值:表示当正则表达式匹配不到内容时返回的默认值。

2)JSON提取器

作用是从JSON格式数据中提取需要的内容
JSON路径表达式
参考:https://github.com/json-path/JsonPath

3)XPATH提取器

作用是从响应中利用XPATH路径表达式来提取内容,可以提取整个标签或者标签的文本,要使用XPATH提取器,响应的数据格式必须是XML
image-1655086396117

4)CSS/Jquery提取器

作用是可以从XML格式的响应中提取标签的某个属性值
image-1655086400521

9、jmeter操作数据库

数据库的提交:增删改操作都是需要提交的,查询不需要提交,提交使用commit语句提交。
jmeter操作数据库的步骤:
1)在测试计划下导入数据库的驱动包,如果是mysql数据库,就导入mysql的驱动包;
2)通过jdbc connection configuration配置元件实现连接数据库,关键的几个配置点有:连接池的名称、数据库的URL、JDBC驱动Class、数据库用户名、数据库密码等。
image-1655086408645
3)使用jdbc请求元件来操作数据库,注意如果sql语句中需要传参,选择Query Type为Prepared Select Statement或Prepared Update Statement,并且在sql中用?来表示需要传入的参数。
image-1655086413508

10、jmeter的断言元件

1)响应断言

用于断言响应中是否包含某个字符串

2)JSON断言

对于响应是JSON格式的情况,可以通过JSON断言来断言是否存在某个键值对以及键值对的值;
image-1655086422212

3)大小断言

作用是实现断言响应的字节大小。
image-1655086427885

4)XPath断言

作用是断言响应的XML文件中是否包含某个元素,填入XPath路径表达式,如果能根据表达式从响应中定位到元素就断言成功。
image-1655086435129

5)断言持续时间

作用是断言响应时间是否低于或等于某个标准,如果低于或等于就断言成功,否则断言失败。
image-1655086438905

11、jmeter监听器

1)汇总报告
image-1655086443863
2)聚合报告
image-1655086447042

12、CLI模式运行Jmeter脚本

如果在在dos下运行使用jmeter命令运行jmeter脚本,需要先把jmeter的安装目录配置到环境变量PATH里面,配置完之后需要重新打开dos窗口刷新;

Jmeter命令的参数:
-h 帮助 -> 打印出有用的信息并退出
-n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
-t 测试文件 -> 要运行的 JMeter 测试脚本.jmx文件
-l 结果文件 -> 记录结果的文件
-r 远程执行 -> 在Jmter.properties文件中指定的所有远程服务器
-H 代理主机 -> 设置 JMeter 使用的代理主机
-P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
-e 在脚本运行结束后生成html报告
-o 用于存放html报告的目录

CLI模式执行举例:jmeter -n -t .\xxx\test01.jmx -l report.jtl -e -o .\report
说明:这里指jmeter 以无图形界面模式来执行某某路径下的测试计划test01.jmx,运行结果保存为report.jtl,并生成html格式的报告,保存在.\report目录下。注意:如果已经有运行结果jtl文件,也可以用如下命令生成html报告 jmeter -g report.jtl -o \path