Jemeter的基础使用
1 概述
Apache JMeter是Apache组织开发的一款开源软件,是典型的纯Java开发的应用程序,可以在不同平台比如Windows、Linux或macOS系统上进行软件测试。JMeter主要用于应用程序的功能负载测试以度量软件的性能,也可以用于其他类型的测试比如接口测试,API测试等。
主要用于做压测的
JMeter设置为中文环境:
- 临时设置
Jmeter菜单栏选择OptionsàChoose LanguageàChinese (Simplified)这种方法,重启软件后又变为英文环境了。
- 永久设置:
进入apache-jmeter-5.2.1\bin目录,找到“jmeter.properties”文件,在文件的第37行后添加“language=zh_CN”,保存之后再打开jmeter就永久变为中文环境了。
2 Jmeter的主要元件
1. 测试计划
使用JMeter进行测试的起点,它是其他JMeter测试元件的容器
2. 线程组
代表一定数量的用户,用来模拟用户并发发送请求。实际的请求内容在Sampler中定义,它被线程组包含。
3. 配置元件
维护Sampler需要的配置信息,并根据实际的需求修改请求的内容
4. 前置处理器
负责在请求之前的工作,常用来修改请求的设置
5. 定时器
负责请求定义之间的延迟间隔
6. 取样器(Sampler)
是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:Http Request Sampler、FTP Request Sampler、TCP Request Sampler、JDBC Request Sampler等,每一种不同类型的sampler可以根据设置的参数向服务器发出不同类型的请求。
7. 后置处理器
主要在请求之后工作,常用来获取返回值
8. 断言
用来判断请求响应的结果是否如用户所期望的
9. 监听器
负责收集测试结果,同时确定结果显示的方式
10. 逻辑控制器
可以自定义JMeter发送请求的行为逻辑,它是Sampler结果使用可以模拟复杂的请求序列
3 JMeter元件的作用域和执行顺序
3.1 元件作用域
- 配置元件:影响其作用范围内的所有元件【配置】
- 前置处理器:在其作用范围内的每一个Sampler元件之前执行【之前处理】
- 定时器:在其作用范围内的每一个Sampler有效【定时发生】
- 后置处理器:在其作用范围内的每一个Sampler元件之后执行【之后处理】
- 断言:在其作用范围内的对每一个Sampler元件执行之后的结果进行校验【校验】
- 监听器:在其作用范围内对每一个Sampler元件的信息收集并呈现【收集信息】
- 总结:从各个元件的层次结构判断每个元件的作用域
3.2 元件执行顺序
配置元件 - 前置处理器 - 定时器 - 取样器 - 后置处理器 - 断言 - 监听器
注意:
- 前置处理器、后置处理器和断言等组件只能对取样器起作用,因此,如果在它们的作用域内没有任何取样器,则不会被执行。
- 如果在同一作用域内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。
4 JMeter进行接口测试流程
使用JMeter进行接口测试的基本步骤:
1. 测试计划
2. 线程组
3. HTTP Cookie管理器
4. Http请求默认值
5. Sampler(HTTP请求)
6. 断言
7. 监听器(查看结果树、图形结果、聚合报告等)
4.1 测试计划
打开JMeter:在bin目录下执行jmeter.bat命令
打开Jmeter,在菜单左侧出现 “测试计划”。在这里测试计划我们可以把它理解成新建的空白项目,在这个空白项目下面可以添加一系列的接口。
4.2 线程组
添加方法:右键点击Test Plan->添加->线程(用户)->线程组。
元件描述:一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。
1. 线程数:虚拟用户数。多少个线程就是多少个虚拟用户。
2. Ramp-Up时间(秒):设置虚拟用户的全部启动时长。如果线程数是20,准备时长为10秒,那么需要10秒
钟启动20个线程,也就是平均每秒启动2个线程。
3. 循环次数:每个线程发送请求的个数。如果线程数为20,循环次数为10,那么每个线程都会发送10次请求。
总请求数为:20*10 = 200,如果勾选了"永远",那么所有线程会一直发送请求,直到手动点击工具栏上的
停止按钮或设置的线程时间结束。
4.3 HTTP Cookie管理器
添加方法:右键线程组 - 添加 - 配置元件 - HTTP Cookie管理器
HTTP Cookie管理器可以像浏览器一样存储和发送cookie,如果我们要发送一个带cookie的http请求,
cookie manager会自动存储该请求的cookies,并且如果后面发送同源站点的http请求时,都可以用
这个cookies
4.4 HTTP请求
①HTTP请求默认值
添加方法:右键线程组 - 添加 - 配置元件 - HTTP请求默认值
HTTP请求默认值是为了方便填写后续内容而设置。主要填写"服务器名称或IP"和"端口号",这样后续的HTTP请求
就不用每次都填写IP地址和端口号了。【默认设置】
②HTTP请求
添加方法:右键线程组 - 添加 - Sampler - HTTP请求
HTTP请求包括接口请求方法、请求路径和请求参数等
HTTP请求参数详解:
- 名称:标识一个取样器,建议"见名知意"
- 注释:对测试无用,仅帮助用户阅读
- 服务器名称或IP:HTTP发送的目标服务器名称或IP地址
- 端口号:目标服务器的端口号,默认值为80
- 协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或HTTPS,默认HTTP
- 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE等
- 路径:目标URL路径(不包括服务器地址和端口)
- 内容编码:内容的编码方式,默认值为ISO8859
- 自动重定向:如果选中该选项,当发送HTTP请求后得到的响应式301/302时,JMeter自动重新定向到新的页面。
- 使用keep Alive:保持JMeter和目标服务器之间的活跃状态,默认选中
- 对Post使用multipart/from-data:当发送POST请求时,使用multipart/from-data方法发送,默认不选中
- 同请求一起发送参数:在请求中发送URL参数,对于带参数的URL,JMeter提供了一个简单的填写参数方法。 【直接通过表格填写】
4.5 响应断言
添加方法:右键HTTP请求 - 添加 - 断言 - 响应断言
检查接口是否访问成功。如果检查失败的话会提供找不到断言的内容,没有提示的话就代表成功了。
- Apply to
指断言的作用范围,通常发出一个请求只触发一个服务器请求,所以勾选"main sample only"就可以1了,如果发一个请求可以触发多个服务器请求,就有main sample和sub-sample之分了
- Main sample and sub-samples 作用于主请求和子请求
- Main sample only:只作用于主请求
- Sub-samples only:只作用于子请求
- JMeter Variable:作用于JMeter变量(输入框内输入jmeter变量名称)
- 测试字段
1. 响应文本:匹配返回的json数据
2. 响应代码:匹配返回代码,如200,404,500等
3. 响应信息:匹配响应回来的信息,如"OK","请求成功"字样
4. 响应头:匹配响应头中的内容
5. 请求头:匹配请求头中的内容
6. URL样本:匹配请求的URL链接,如果有重定向则包含请求URL和重定向URL
7. 文档(文本):匹配响应数据的文本形式
8. 忽略状态:一个请求如果有多个响应断言,第一个响应断言选中此项,当第一个响应断言失败时,可以忽略此
响应,继续进行下一个断言。如果下一个断言成功,则还是判断事务是成功的
9. 请求数据:配置请求的数据
- 模式匹配规则
- 包括:响应内容包含需要匹配内容就代表响应成功【支持正则】
- 匹配:响应内容要完全匹配需要匹配的内容才代表响应成功【大小写不敏感,支持正则】
- 字符串:响应内容要包含需要匹配的内容才代表响应的内容【大小写敏感,不支持正则】
- 相等:响应内容要完全等于需要匹配的内容才代表响应成功【大小写敏感,不支持正则】
- 否:相当于取反,如果结果为true,勾上该选项,就为false
- 或者:如果不想用AND连接(所有模式都必须匹配,断言才算成功),用OR选项可以用于将多个断言模式进行
OR连接(只要有一个模式匹配,断言就是成功的)
- 测试模式(输入要断言的数据)
其实就是增加断言的数据,点击"添加",输入要断言的数据
4.6 增加监听器
添加方法:线程组 - 右键添加 - 监听器 - 查看结果树。一般还会一并添加图形结果、聚合报告。
元件描述:树状形式显示接口的访问结果,包括请求结果、请求内容、服务器的响应内容。
5 实战
5.1 简单应用
访问百度(www.baidu.com)为例
①新建线程组,设置线程数为1
②新增HTTP请求
③右击HTTP请求 - 添加响应断言
④添加监听器 - 结果树
⑤保存之后,点击运行执行测试,查看结果
5.1 JMeter使用cookie
JMeter使用Cookie,有两种方式,一种是使用HTTP Cookie管理器,一种是使用HTTP信息头管理器
服务器应用代码(端口是8201):
@RestController
public class TestController {
@GetMapping("/test")
public void testCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
System.out.println("name: " + cookie.getName());
System.out.println("value: " + cookie.getValue());
}
}
}
①使用HTTP Cookie管理器:
- 创建一个,HTTP请求,配置如下:
- 创建HTTP Cookie管理器【右击HTTP请求 - 添加 - 配置元件 - HTTP Cookie管理器】
可以看到我们传了两个数据过去:userId与userAge
Cookie管理器不起作用
:
- 在JMeter的bin目录下,修改配置文件jmeter.properties下的参数【CookieManager.save.cookies=true】,重启JMeter
- 尝试修改cookie标准
- 发送HTTP请求(请求成功后查看结果树)
服务器接收到的数据:
②使用HTTP信息头管理器
- 新加HTTP信息头管理器
HTTP请求 - 添加 - 配置元件 - HTTP信息头管理
-
新增数据(名称需要为Cookie,区分大小写)
-
发起请求,查看结果树
-
服务端结果:
③注意
使用了HTTP Cookie管理器了就不要再HTTP信息头里面再添加Cookie信息了,容易起冲突
参考文章:
https://zhuanlan.zhihu.com/p/72905562
https://zhuanlan.zhihu.com/p/142897766