jmeter工具
学习目标
- 成功配置jmeter环境变量
- 掌握常用的界面和操作
1. jmeter介绍
- JMeter是Apache 组织使用Java开发的一款测试工具
- 可以用于对服务器、网络或对象模拟巨大的负载
- 通过创建带有断言的脚本来验证程序是否能返回期望的结果
优点:
- 开源、免费
- 跨平台
- 支持多协议
- 小巧
- 功能强大
缺点:
- 不支持IP欺骗
- 无法验证界面UI
2. 下载地址
jmeter下载地址:https://jmeter.apache.org/download_jmeter.cgi
jdk下载地址:https://www.oracle.com/java/technologies/downloads/
3. JDK环境安装配置
傻瓜式安装,无需教程
①直接运行exe文件,只需要更改两个地址,第一个地址是jdk路径、第二个地址是jre路径
②配置java环境变量
· 单击"计算机-属性-高级系统设置",单击"环境变量"· 新建->变量名"JAVA_HOME",变量值为"安装jdk时第一次修改的路径"
· 编辑->变量名"Path",点击"新建",然后输入"%JAVA_HOME%\bin"、"%JAVA_HOME%\jre\bin"
· 新建->变量名"CLASSPATH", 变量值".;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar"
③检查java环境变量是否配置成功:
cmd打开dos命令窗口,执行:java -version 查看java版本
4. 解决接口响应报文中文乱码
- 进入Jmeter的bin目录下,找到jmeter.properties文件
- 将#sampleresult.default.encoding=ISO-8859-1的注释去掉
- 改成:sampleresult.default.encoding=UTF-8
- 重启Jmeter
5. 启动jmeter
解压后,进入bin目录,双击启动jmeter.jar 或 jmeter.bat文件
--------- 界面操作 --------
1. 测试计划

测试计划界面上的功能,需要配合其他控件一起使用才能达到效果
2. 线程组

Ⅰ. 理解“在取样器错误后要执行的动作”
① 继续:忽略错误继续执行后续脚本
假设有jmeter脚本如下,其中“登录1”和“登录3”为正确接口请求,“登录2”为错误接口请求。

② 启动下一进程循环:忽略错误,当前线程的剩余脚本不再运行,直接进入下一个循环
假设有jmeter脚本如下,其中“登录1”和“登录3”为正确接口请求,“登录2”为错误接口请求。且线程组的循环次数设置为“2”


③ 停止线程:整个脚本停止运行,友好停止
假设有jmeter脚本如下,除“登录2”为错误接口请求以为,其他接口均正确。

友好型停止:若有其它接口已将请求发出,但还未收到服务器响应报文,则会允许它完整完成请求后再停下来
④ 立即停止线程:整个脚本停止运行,强制停止
假设有jmeter脚本如下,除“登录2”为错误接口请求以为,其他接口均正确。

强制型停止:若有其它接口已将请求发出,但还未收到服务器响应报文,则也会强行将请求掐断
Ⅱ. 理解“线程属性”
① 线程数+循环次数
假设有jmeter脚本如下,线程数(虚拟用户数)为2,循环次数为3。


② 线程数+Ramp-Up时间
假设有jmeter脚本如下,线程数(虚拟用户数)为5,启动时间为10。


花多少秒启动多少用户,只能作为参考数据,不能作为精准数据
③ 循环次数永远+调度器
假设有jmeter脚本如下,循环次数勾选“永远”,调度器的持续时间设置为“5”。



此时强调的是运行时间5秒,具体循环次数不确定
④ 具体循环次数+调度器
假设有jmeter脚本如下,循环次数为5,调度器的持续时间设置为“5”。



两个条件任意触发一个,脚本都会停止
Ⅲ. setUp线程组和tearDown线程组
- setUp线程组:所有线程中第一个被运行的线程,往往用于初始化操作
- tearDown线程组:所有线程中最后一个被运行的线程,往往用于收尾数据


3. HTTP请求

Ⅰ. 发送POST+application/x-www-form-urlencoded请求

Ⅱ. 发送POST+application/json请求

Ⅲ. 发送GET请求

4. 察看结果树




5. 聚合报告

6. HTTP请求默认值



注意就近原则
- 当只有一个“HTTP请求默认值”组件时,且http请求内部也未填写对应的请求信息,则取“HTTP请求默认值”中的值
- 当只有一个“HTTP请求默认值”组件时,且http请求内部已存在请求信息,则取http请求内部的值
- 当只有多个“HTTP请求默认值”组件时,且http请求内部也未填写对应的请求信息,则向上取最近的“HTTP请求默认值”中的值
7. HTTP信息头管理器
Ⅰ.若每个HTTP请求共用一个信息头

Ⅱ. 若每个HTTP请求都有不同的信息头

8. cookie管理器
有些接口请求之后,响应头中会有set-cookies参数,因此需要我们添加cookie管理器

不需要任何操作,只需要添加在脚本前方即可


9. 参数化-用户定义的变量





如果存在多个同名变量,则遵守就近原则
10. 函数助手

Ⅰ. 计数器counter函数





Ⅱ. 随机数Random函数



Ⅲ. 时间time函数




11. 参数化-用户变量





12. 参数化-CSV文件





13. JDBC数据库连接







Ⅰ. 利用计数器counter函数,取全部查询结果中的值
直接写${username_1},只能取第一个值,不能取其他的值。但,只要将数字“1”动态化,即可取其他的值




但此时发现,JDBC Request的SQL语句也被执行了10次,属于资源浪费。可以用“循环控制器”组件代替“线程组”里的循环次数
Ⅱ. 利用“循环控制器”组件,取全部查询结果中的值



Ⅲ. 利用Random随机函数,随机取值
想要更贴近用户真实操作,可以利用随机数。只要将数字“1”随机化,即可随机取其他的值



14. XPath提取器
当接口的响应报文是XML、HTML标签类型时,可以利用XPath提取器,提取响应报文里的数据



15. 正则提取器
接口的响应报文无论任何类型,都可以利用正则提取器,提取响应报文里的数据





Ⅰ. 转义字符
- $ ---> \$
- ( ---> \(
- ) ---> \)
- * ---> \*
- + ---> \+
- . ---> \.
- [ ---> \[
- ] ---> \]
- ? ---> \?
- \ ---> \\
- / ---> \/
- ^ ---> \^
- { ---> \{
- } ---> \}
案例:
- id?labelId":"1290" ---> 正则写法 id\?labelId":"(.+?)"
- labelId\":\"1290\" ---> 正则写法 labelId\\":\\"(.+?)\\"
- labelId":(1290), ---> 正则写法 labelId":\((.+?)\),
16. JSON提取器
若接口的响应报文是json类型,可以利用json提取器,提取响应报文里的数据



17. 使用全局变量
若多个线程组之间需要进行传递变量,可以使用全局变量函数set_property和property





18. 响应断言
给接口设置断言,将预期结果写在断言中,若实际结果与预期结果不符合,则报错



19. 大小断言
给接口设置响应大小的断言,将预期的响应结果的字节数写在断言中,若实际结果与预期结果不符合,则报错



20. 断言持续时间
给接口设置响应时间的断言,将预期的响应时间最大时长写在断言中,若实际结果与预期结果不符合,则报错


21. JSON断言
给接口响应报文是JSON,可以使用JSON断言对响应结果进行预期判断

如果要判断空Expect Null,需要勾选上Additionally assert value

22. 如果(IF)控制器
若有些接口场景,不同的情况下要调用不同的接口,可以使用如果(IF)控制器
假设有如下场景:
- 提供一个初始化token,需要判断该token是否有效
- ①有效,则直接获取个人信息
- ②无效,则先执行登录接口,得到最新的token,再去获取个人信息







如下是“token”失效,需要登录的情况:

如下是“token”有效,不需要登录的情况:

23. ForEach控制器
当变量名有“xxxx_1”这种固定格式(如JDBC取值),可以使用ForEach控制器循环遍历取值。




24. 调试取样器


25. 循环控制器


26. 计数器

如果虚拟用户数设置=2,循环次数3次,勾选“与每用户独立的跟踪计数器”↓↓↓

如果虚拟用户数设置=2,循环次数3次,不勾选“与每用户独立的跟踪计数器”↓↓↓

如果虚拟用户数设置=2,循环次数3次,不勾选“与每用户独立的跟踪计数器”,步长设置为3↓↓↓

27. 同步定时器
当需要模拟并发场景时,可用利用同步定时器



28. 常数吞吐量定时器
当需要控制吞吐量时,可以利用常数吞吐量定时器


