(目录)
JMeter基础
1 JMeter介绍
1.1 什么是JMeter?
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。
JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。
1.2 JMeter的优缺点
优点:
- 扩展性强,插件丰富,灵活性高
- 可以和很多工具兼容,方便自动化
- 与平台无关
缺点:
- JMeter的GUI模式资源消耗较大,在真正需要负载压测时需要在非GUI环境下进行,并且关闭不需要的监听器。
- JMeter采用线程并发机制,主要依靠增加线程数来提高并发量。当单机模拟数以千计的并发用户时,JMeter对系统的CPU和内存资料消耗巨大,能支持并发数量不多。
2 JMeter的安装
安装步骤:略
**注意:**安装包的版本选择Binaries的可执行版本(Source是源码版本)
3 JMeter的执行
JMeter在执行时GUI界面比较消耗系统资源,应该将真正的压测任务脚本放到服务器上开展执行。在Linux上通过命令行的方式使用。
①单机执行脚本命令
./bin/jmeter -n -t 【Jmx脚本位置】-l 【中间文件result.jtl位置】-e -o 【报告指定文件夹】
②分布式执行脚本命令
./bin/jmeter -n -t 【Jmx脚本位置】-R ip1:1099,ip2:1099 -l 【中间文件result.jtl位置】-e -o 【报告指定文件夹】
4 JMeter结果查看
①结果文件查看
结果文件类型为 jtl 或 csv,测试计划里添加的哪种监听器,就可通过JMeter的相应的监听器浏览结果文件,查看最终的结果。
-
打开JMeter图形窗口,并新建或打开一个测试计划,为该计划添加“结果查看树”和“聚合报告”
-
打开聚合报告,点击“浏览”按钮打开测试结果文件test.jtl生成聚合报告。
②HTML报告查看
将指定生成的报告指定文件夹打包,然后点击查看index文件
5 JMeter的常用核心组件
5.1 测试计划
一个测试计划中至少包含一个线程组,多个线程组之间可以并行运行,也可以串行运行,可在测试计划页面中进行选择。
5.2 线程组
5.2.1 线程组
PS:Same user on each iteration表示每个迭代都用相同的线程。这个得从老版本讲起,在以前 3.x 和 4.x 版本的 JMeter 中,是没有这个选项的。创建好 1 个线程后,每次迭代都是用这个线程,直到测试结束。它的影响就是,比如登录,加了 HTTP Cookie 管理器以后,单个线程多次迭代(注意不是多个线程哦)登录用的都是相同的 Cookie。5.x 版本加入了这个选项,可以控制每次迭代是否创建新的线程。同时在 HTTP Cookie 管理器也增加了一个选项,控制是否清除旧 Cookie。
**默认这个 Same user on each iteration 的选项是勾选的。**因为销毁和创建线程本身就会占用资源,可能会影响性能测试结果
5.2.2 并发线程组
在实际性能测试过程中,可能需要模拟一种阶梯式的压力情况(从某个值开始不断增加压力,直到达到某个值,然后持续运行一段时间)。这种场景下JMeter本身的组件无法完成,需要用到扩展插件Custom Thread Groups
。
1 安装插件管理工具
①官网下载 JMeter Plugins 的jar包
②将下载的jar包复制到 %JMETER_HOME%\lib\ext
目录下
③启动 JMeter --> Options --> Plugins Manager 。(如果没将jar包放在ext目录下是没有该选项的)
2 安装Custom Thread Groups插件
3 选择阶梯式加压插件
5.3 配置元件
配置元件用来设置一些JMeter的脚本公用信息,会影响其作用范围内的所有元件,常用的包括:HTTP请求默认值、HTTP消息头管理器、CSV参数化配置元件等。
5.3.1 请求默认值
一般用作全局的配置,有多个请求的时候,可以把默认公共的值作为请求默认值,如:IP地址和端口号一样。
5.3.2 HTTP消息头管理器
HTTP请求需要传递后后端服务器的一些验证信息,如:token、cookie,可以放到HTTP消息头管理器中。HTTP消息头是在客户端请求或服务端响应时传递的,通常位于请求响应的第一行,HTTP消息体在其后传输。每个消息头最后回车符或者换行符结尾。
注意Content-Type的类型,一般为application/json的json数据格式传输
Content-Type的类型 | 含义 |
---|---|
application/x-www-form-urlencoded | 常见的 POST 提交数据的方式,原生Form表单,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。 |
multipart/form-data | 常见的 POST 数据提交的方式, Form 表单的 enctype 设置为multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符(这就是boundary的作用)分开,类似我们上面Content-Type中的例子 |
application/json | 消息主体是序列化后的 JSON 字符串 |
application/octet-stream | 二进制流数据(如常见的文件下载) |
multipart/form-data | 需要在表单中进行文件上传时,就需要使用该格式 |
PS:
①当有多个消息头管理器,且不同消息头管理器内有名称相同的消息体时,顺序靠前的管理器中的消息体会覆盖后面的。
②web程序中用来跟踪用户的会话常用的为cookie和session技术。cookie通过客户端记录确定用户身份,session通过服务器记录确定用户身份。
5.3.3 CSV参数化配置元件
PS:引用的格式为${变量名},如果是分布式压测,需将CSV文件上传到各个压测从机上,同时注意文件路径的修改
5.4 监听器
监听器最常用的为查看结果树和聚合报告,需要注意的是,监听器会消耗系统资源,真正压测时应该尽量避免开启不必要的监听器。
5.4.1 聚合报告
性能测试中需要理解聚合报告中的各个参数的含义,并以此分析性能测试结果。
PS:性能测试过程中Average、90%Line、95%Line、Error%、Throughout这几个参数作为性能分析重要指标数据。
5.4.2 查看结果树
通常该组件用于脚本调试时,观察请求和响应是否正确,包括请求头、请求体、响应内容等。在真正压测的时应该尽量禁用或者删除该组件,否则会对客户端性能造成影响,性能测试第一原则是不能让性能瓶颈出现在发起压测的客户端。
5.5 逻辑控制器
作用:用户可通过逻辑控制器来控制脚本的执行顺序,以便更加真实地模拟按照用户期望的顺序和逻辑执行脚本。
逻辑控制器包含两类十几种:
①一类是控制测试计划执行过程中节点的逻辑执行顺序,常用的有if控制器、循环控制器和随机控制器。
②另一类是对测试计划中的脚本进行分组、方便JMeter统计执行结果以及进行脚本的运行时控制等,如事务控制器、吞吐量控制器。
最常用逻辑控制器:简单控制器、事务控制器、if控制器、仅一次控制器、吞吐量控制器
5.5.1 简单控制器
这是Jmeter里最简单的一个控制器,它可以组织我们的采样器和其它的逻辑控制器(分组功能),提供一个块的结构和控制,并不具有任何的逻辑控制或运行时的功能,对内部取样器没有任何影响,只是方面分组命令。
5.5.2 事务控制器
产一个额外的采样器,可以在该控制器下添加多个请求,当做一个事务,统计该控制器子结点的所有时间。
Generate parent sample:是否生成父取样结果,勾选后有两个效果,一是Aggregate Report会看到Transaction Controller字样,它把节点下的取样器的运行结果(如消耗时间)累加在一起(注意事务控制器下如果有多个取样器,全部取样器都运行成功,整个事务控制器才算成功)
①不勾选Generate parent sample
②勾选Generate parent sample
Include duration of timer and pre-post processors in generated sample:统计结果会包括定时器和前置-后置处理器的耗时,建议不用勾选,不然会影响统计结果。
5.5.3 If控制器
①根据给定表达式的值决定是否执行该节点下的子节点,可以使用变量表达式或JavaScript(条件为True时执行,否则不执行)。
②勾选Interpret Condition as Variable Expression表示使用变量表达式,建议勾选上。这时可以借助函数助手中的_jexl3
和_groovy
将条件表达式计算为true/false。
③默认情况下,条件在初始输入时只判断一次,勾选Evaluate for all children表示在每个子结点执行前计算表达式。
eg:发送if判断前的请求->正则表达式后置处理器提取返回的数据->if逻辑控制器判断提取的参数信息->根据if判断结果是否执行if控制器内的请求
5.5.4 仅一次控制器
控制只执行一次的控制器,通常用于登录请求。
5.5.5 吞吐量控制器
吞吐量控制器用于控制其下的子节点的执行次数与负载比例分配,通常用于混合场景下的比例测试。有两种方式:
①Total Executions:设置运行次数
②Percent Executions:设置运行比例(1~100之间)
Per User:当选择Total Executions时,它表示线程数;当选择Percent Executions时,它表示线程数*循环次数。一般不选。