JMeter


这篇文章主要介绍JMeter开源性能测试工具的使用。笔记来自白月黑羽

JMeter

JMeter 是一个功能强大的开源性能测试工具,它由一组可定制的测试脚本组成,可以模拟各种负载和场景,例如并发用户、请求频率、数据包大小、延迟等。 不仅可以用于测试 Web 应用程序、网络应用程序、分布式系统和其他软件系统的性能和稳定性,同时还具有可扩展性、可定制性、易于使用和可靠性等优点,因此被广泛应用于自动化测试、性能测试和压力测试等领域。

JMeter 由三个主要组件组成:

  1. JMeter 测试框架:这是一个命令行工具,它可以用于启动、配置和监控性能测试。JMeter 测试框架提供了一些内置的测试场景,例如 HTTP 请求、线程组、采样器、断言等,用户可以根据需求进行自定义。

  2. JMeter 脚本语言:这是一种基于 Java 的脚本语言,它允许用户自定义测试场景和测试参数。JMeter 脚本语言支持各种语法和功能,例如条件语句、循环结构、变量赋值、函数等。

  3. JMeter 测试结果分析工具:这是一个 Web 界面,它可以用于分析和可视化 JMeter 测试结果。JMeter 测试结果分析工具提供了各种指标和图表,例如吞吐量、响应时间、错误率、CPU 使用率等,用户可以通过这些指标和图表对系统的性能进行评估和优化。

优点

  1. 可扩展性:JMeter 支持自定义测试脚本,因此可以方便地添加和删除测试元素,以适应不同的测试需求。
  1. 可定制性:JMeter 提供了大量的可定制选项,例如测试脚本、负载生成器、HTTP 请求等,因此可以方便地调整测试结果。
  1. 易于使用:JMeter 易于安装和配置,并且提供了简单的命令行界面,因此可以方便地用于自动化测试和其他场景。
  1. 可靠性:JMeter 经过多次版本更新,已经变得越来越稳定,并且有大量的用户和贡献者参与维护和开发。

JMeter多种测试场景和测试结果分析工具

  1. HTTP 请求:JMeter 可以生成各种 HTTP 请求,例如 GET、POST、PUT、DELETE 等,用户可以通过这些请求测试 Web 应用程序的性能和稳定性。
  1. TCP 连接:JMeter 可以生成多个 TCP 连接,用户可以通过这些连接测试网络应用程序的性能和稳定性。
  1. 负载生成器:JMeter 可以生成各种负载,例如并发用户、请求频率、数据包大小等,用户可以通过这些负载测试系统在高负载条件下的性能和稳定性。
  1. 断言:JMeter 支持各种断言,例如成功断言、失败断言、时间断言、参数断言等,用户可以通过这些断言测试 HTTP 请求的可靠性和正确性。

JMeter 测试结果分析工具提供了各种指标和图表,例如吞吐量、响应时间、错误率、CPU 使用率等,用户可以通过这些指标和图表对系统的性能进行评估和优化。

  1. 自定义报告:用户可以自定义 JMeter 测试报告,以适应不同的测试需求。JMeter 测试报告可以包括各种指标和图表,例如吞吐量、响应时间、错误率、CPU 使用率等。

  2. 数据收集:JMeter 测试结果分析工具可以收集和分析测试数据,例如请求次数、响应次数、响应时间、错误率等。用户可以通过这些数据对系统的性能进行评估和优化。

  3. 测试报告生成:JMeter 测试结果分析工具可以生成测试报告,并将其保存在本地或远程服务器上。用户可以通过这些报告了解系统的性能和稳定性,并进行优化。

  4. 自动化测试:JMeter 支持自动化测试,用户可以通过这些测试脚本自动化执行测试,并记录测试结果。自动化测试可以提高测试效率和准确性。

JMeter安装

环境准备

首先因为JMete是Java程序首先得先准备好JDK环境,其次安装JMeter程序,最后当然是准备好被测试的系统。

下载地址

https://jmeter.apache.org/download_jmeter.cgi

解压后进入到bin目录下双击 jmeter.bat文件即可运行。

如果界面比较小可以在Options中点击Zoom In 放大。

测试结果中文乱码问题

Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码

  1. 进入Jmeter的bin目录下,找到jmeter.properties文件
  2. 将#sampleresult.default.encoding=ISO-8859-1的注释去掉
  3. 改成:sampleresult.default.encoding=UTF-8
  4. 重启

JMeter使用

一个JMeter的测试计划(test plan)对应性能测试的一个场景,其实也就是一个测试用例。

线程组

Http请求

HTTP请求默认值

系统更换环境时间避免重复修改每个http请求中的ip配置可以利用默认值方式

监听器

在根节点配置一个监听器才能看到执行结果

Connect Time : 
  jmeter 和 被测系统 建立 TCP 连接的时间,包括3路握手时间,
  如果连接复用, 值为0

lantency:
  从发出请求前 到 接收完第一个响应的时间

loadtime(以前叫Elapsed time):
  从发出请求前 到 接收完所有响应的时间
  如果是长消息, 往往时长 >= lantency,因为有多个响应

Size in bytes :        整个消息消息大小 = Headers size in bytes + Body size in bytes
Headers size in bytes : 响应消息头大小
Body size in bytes :   响应消息体大小

录制网站流量

如果不行一个个自己去建立线程组和控制器,那么可以利用http代理然后录制的方式实现。

JMeter提供了录制浏览器的请求的方法,使用的是代理抓包的机制。

  1. 确保 HTTP请求默认值 里面的服务器IP 和录制的网址一致。否则录制时,每个HTTP请求里面都会带上IP,还得手工修改删除,不利于统一使用HTTP请求默认值 里面的服务器IP。

  2. 在整个测试计划下面添加 HTTP代理服务器。英文叫 HTTP(S) Test Script Recorder

  1. 在线程组里面添加逻辑控制器->录制控制器

  1. 设置HTTP代理服务器
  • 分组选项选择: 将每个组放到新的事物控制器中

  • 如果你需要录制时过滤掉一些请求点击Request Filtering 配置页,排除模式下添加你要过滤掉不抓取的类型资源 ,使用的是正则表达式

比如

(?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2)

就是排除 访问 所有上述扩展名的 HTTP请求。

detectportal\.firefox\.com.*

就是排除 所有 访问 detectportal.firefox.com 的请求。

  • 点击代理服务器的启动按钮
  1. 设置浏览器代理为 本机(localhost) 的 8888端口,进行对应的界面操作应该发现抓到了相应的请求。

    可以安装浏览器管理代理插件: Proxy SwitchyOmega

  1. 右键点击录制线程组点击验证 ,查看一下是否能正确模拟

  2. 继续其它场景的录制和拖动

  3. 结束录制,修改浏览器设置,取消代理

注意结束录制后记得在浏览器关闭代理

流量录制Https请求问题

这里遇到了很多小坑,由于我的项目放在服务器上而且是Https的请求,所以会存在安全证书问题导致无法访问。

  1. 在HTTP(S) Test Script Recorder中,点击“启动”按钮。在JMeter的bin目录下会生成名为ApacheJMeterTemporaryRootCA.crt的证书文件

  1. JMeter打开Options—》SSL Manager 导入安全证书

  1. 浏览器中添加证书

  1. 代理设置

模拟间隔时间

可以使用 JMeter的 定时器 Timer也可以使用 取样器 里面的 测试活动 flow control action 取样器

注意定时器Timer可能会使同级目录下所有请求都等待间隔。

命令行模式执行

在进行性能压测的时候GUI模式比较占用资源一般都是通过命令行模式执行的。

注意需要先把test plan保存jmx文件

d:\ProgramFiles\JMeter\apache-jmeter-5.5\bin\jmeter -n -t d:\Projects\JmeterTest\TestPlan.jmx  -l log.jtl

log.jtl会生成在cmd当前路径(生成文件后将后缀改为csv可以用excel打开)

dashboard 产生图表

d:\ProgramFiles\JMeter\apache-jmeter-5.5\bin\jmeter -g log.jtl -o report1

就会产生report1目录,里面的index.html 打开就是报告

注意 -o 后面的目录 一定要不存在,或者内容为空,否则会报错或覆盖旧数据。

其中 APDEX (Application Performance Index) 里面的 T (Toleration threshold) 和 F (Frustration threshold) 可以通过 JMeter 工具 bin 目录下面的 user.properties 配置文件里面 这两个选项来设置

jmeter.reportgenerator.apdex_satisfied_threshold
jmeter.reportgenerator.apdex_tolerated_threshold

Cookie管理器

当在 JMeter 中测试 Web 应用程序时,Cookie 管理器可以帮助您存储和传递 Cookie 数据,以便在多个请求之间共享。让JMeter自动把接收到的 HTTP 响应消息中的 Cookie 保存起来,并且在后续发给该网站的请求中自动携带上, 可以在测试计划节点下面添加一个 HTTP Cookie管理器

消息数据关联

做API接口性能测试的时候,后面的请求参数往往需要根据前面的请求结果来决定。这样,测试工具填入的数据就是动态的,没法预先写死。JMeter 通过 后置处理器 取出 取样器响应结果中 要提出取出来的数据, 存入变量,后续请求使用这些变量。这样,当第一个测试元素的输出数据发生变化时,第二个测试元素可以检测到这种变化,并自动更新其输出数据。

后置处理器

后置处理器通常用于对 取样器 结果进行后续处理。后置处理器的有效范围是同级所有取样器,如果只要针对某个取样器,应该添加在它下面常用的一个后置处理器是 JSON提取器 , 可以把 HTTP响应消息中的数据提取到变量中,供后续使用

说明文档:https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor

测试网页: http://www.e123456.com/aaaphp/online/jsonpath/

HTTP响应中有UTF8编码的中文显示为乱码,可以在设置一个 BeanShell PostProcessor 类型的后置处理器,并且在 Script 中增加 prev.setDataEncoding(“UTF-8”);

JSON提取器说明:

Apply to: 应用范围

Names of created variables : 接收值的变量名,自定义,多个变量用分号分隔

JSON Path expression: json path表达式,也是用分号分隔

Match No.(0 for Random):
0表示随机;
n取第几个匹配值;
-1匹配所有。
若只要获取到匹配的第一个值,则填写1

Default Values: 缺省值,匹配不到值的时候取该值,可写error。

变量

JMeter中,使用变量,是通过 ${变量名} 这样的格式.变量可以用户自己定义产生,也可以由前置处理器、后置处理器 等 JMeter 元件产生。有的是JMeter内置变量,比如表示当前线程号的变量 __threadNum ,就可以这样使用 ${__threadNum}

CSV数据文件设置

有时候,性能测试有大量的数据 需要从 CSV 格式的文件读入使用。

CSV格式的文件其实就是文本文件(右键新建txt改后缀),里面记录了性能测试数据,比如

# 每一列代表一种数据,每一行代表每个线程执行的那组数据
username,passowrd
aaaaaaa,123456
bbbbbbb,123456
ccccccc,123456

在线程组下面添加 CSV data set config(CSV 数据文件设置) 元件CSV 数据文件设置可以为每列设置一个变量名,每行数据依次分配给一个线程。每个线程里面的元件就可以使用这些变量得到对应的数据。

断言

利用JMeter断言,可以判定从被测系统收到的响应消息是否正确。断言的有效范围是同级所有取样器,如果只要针对某个取样器,应该添加在它下面。

JSON断言

循环控制器

线程组可以整体循环,但是如果你只想循环线程组其中的一部分操作就需要用到循环控制器。

循环控制器 内部的元件有时 需要用到 当前循环序号 。JMeter 的当前循环序号放到变量 jm<循环控制器名称>__idx 中。比如你的循环控制器名为 LC, 你就可以通过 ${__jm__LC__idx} 访问到当前循环序号。

预处理(前置处理器)

预处理器 在取样器请求 发出前执行一些操作。用的比较多的是:设置一些参数、修改取样器的设置、脚本预处理。有效范围是同级所有取样器,如果只要针对某个取样器,应该添加在它下面。常用的有用户参数、HTML链接解析器、JSR223/BeanShell 等前置处理器


文章作者: Sky
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sky !
评论
  目录