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. 常数吞吐量定时器

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