文章目录
- JMeter之计数器
- JMeter之集合点
- JMeter之断言
- JMeter之动态关联
- 后置处理器:
- 正则表达式提取器
- JMeter之分布式测试
- JMeter之组件执行顺序
- 元件的作用域
- 元件的执行顺序
- 配置元件
- Http Cookie管理器
- 多协议接口的性能测试
- Debug采样器
- Http请求中文乱码的解决
- Post参数设置
- WebService接口
- JMeter之数据库
- BeanShell 取样器
- JMeter之FTP程序
- 逻辑控制器
- 简单控制器
- 如果(If)控制器
- 循环控制器
- While控制器
- ForEach控制器
- 交替控制器
- Switch 控制器
- 随机(顺序)控制器
- 事务控制器
- 吞吐量控制器
- 定时器特点
- 固定定时器
- 同步定时器(Synchronizing Timer)
- 函数助手
- JMeter插件安装-非GUI界面
- 插件安装
- 监听器-察看结果树
- 监听器-聚合报告
- 非GUI界面启动
- 性能优化-注意事项
- 测试报告解析
JMeter之计数器
作用:允许用户在线程组中任何位置创建引用的计数器。计数器配置允许用户配置起始点,最大值和增量。计数器将从开始循环到最大,然后从开始重新开始,继续进行,直到测试结束。
JMeter之集合点
- 用于操作与操作之间设置等待时间,类似于LR中的思考时间
- 定时器/同步定时器,需要将集合点设置在需要的元件前面,才有效。
- 模拟用户组的数量:集合多少人后再执行请求
- 超时时间:多少秒没集合到指定人数算超时
JMeter之断言
- 作用:判断用于检测测试中得到的相应数据是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否于预期一致。
- 断言(检查点)
- 响应断言(创建检查点)
- 断言结果(对于结果的判断)
- 断言持续时间(持续时间)
- Size Assertion(字节大小)
- 注意:与位置相关,需要放在请求范围内
JMeter之动态关联
后置处理器:
- 用于对Sampler发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据。
- 两种方式:正则,xpath(返回为xml)
- 例如:每一个新建的bug,会有一个自动分配的自增长的ID,需要使用正则表达式提取器获取这个由服务器返回的值。
- . 任意单个字符
- +一次或者多次
- *匹配多次
- ? 在找到第一个匹配项后停止。
- 模板:是使用提取到的第几个参数。因为可能有多个值匹配,所以要使用模板。从 1 开始匹配,依次类推。这里只有一个,所以填写$1 $即可;
- 匹配数字:表示如何取值。0 代表随机取值,-1 代表全部取值。这里只y有一个,填 1 即可;
- 缺省值表示参数没有取到值的话,默认给它的值。一般不填。
正则表达式提取器
- 引用名称:下一个请求要引用的参数名称,如填写bugid,则可用${bugid}引用它
- 正则表达式中()括起来的部分就是要提取的
JMeter之分布式测试
- JMeter 是Java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误。为了让JMeter工具提供更大的负载能力,有了使用多台机器同时产生负载的机制。
- JMeter分布式执行原理:
- 1、JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为客户机(Agent)。
- 2、执行时,Controller会把脚本发送到每台Agent上,Agent拿到脚本后就开始执行,agent执行时不需要启动GUI,是通过命令行模式执行的。
- 3、执行完成后,Agent会把结果回传给Controller,Controller会收集所有Agent的信息并汇总
- 前提条件:关闭防火墙
- 1.Agent在jmeter.properties添加server_port=1099
- 2.在Controller机器的bin目录下,找到jmeter.properties
- 3.运行所有Agent机器上的jmeter-server.bat文件
- 4.启动Controller机器上的JMeter应用,选择菜单“运行/远程启动”分别来启动Agent,也可以直接选择“远程全部启动”来将所有的Agent启动
- 注意事项:
- 控制机本身也可以作为一台agent,在remote_hosts后面加上127.0.0.1即可,但控制机(Controller)和执行机 (agent)最好分开,由于Controller需要发送信息给agent并且会接收agent回传回来的测试数据,其自身会有较大消耗,所以建议单独用一台机器作为Controller。
- 参数文件:如果使用csv进行参数化,那么需要把参数文件在每台agent上拷一份且路径需要设置成一样的。
- 每台机器上安装的JMeter版本和插件最好都一致,否则会出一些意外的问题。
- bin目录下有一个create-rmi-keystore.bat执行这个按提示生成密钥。会在bin目录下生成一个rmi_keystore.jks文件。
- 修改jmeter.properties文件下server.rmi.ssl.disable=true
- 找到jmeter.properties文件,修改如下两个配置项,server_port=5000,server.rmi.localport=5000
- 执行jmeter_server.bat
JMeter之组件执行顺序
元件的作用域
- 元件的作用域是依靠“测试计划”的树形结构中元件的父子关系来确定的
- HTTP1、2、3无作用域的概念
- 循环控制器:HTTP2、3 图形结果
- 图形结果: HTTP2、3
- 聚合报告: HTTP1、2、3
- 注意:从各个元件的层次结构判断每个元件的作用域
- 固定定时器:http1
- 循环控制器:http2、http3、图形结果、随机控制器
- 图形结果:http2、http3
- 响应断言:jdbc
- 聚合报告:所有
元件的执行顺序
- 配置元件
- 前置处理程序
- 定时器
- 采样器后置处理程序
- 断言
- 监听器
如果在同一个作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。
配置元件
配置元件的作用主要为了初始化默认值和变量,以便后续取样器引用。相对于JAVA语言中间定义一些常量和静态变量。配置元件作用域是最初始阶段处理,配置元件仅对其所在的测试树分支有效,在同一个作用域的任何采样器前,同时,线程组A 中间定义了配置元件中间的用户定义变量,线程组同样可以引用该变量,所以,配置元件的作用域是可以跨线程组的。
Http Cookie管理器
- 存储在用户客户端的数据
- 当用户结束浏览器会话时,系统将终止所有的Cookie。当web服务器创建了Cookie后,只要在有效期内,访问同一个服务器时,浏览器首先要检查本地的Cookies,并将其发送给Web服务器。
- jmeter.properties修改为true
- CookieManager.save.cookies=true重启JMeter
- 添加 配置元件/HTTP Cookie 管理器
多协议接口的性能测试
Debug采样器
- Debug Sampler 生成一个包含所有 JMeter 变量和/或属性值的示例。
- 这些值可以在“查看结果树-响应数据”窗格中查看https://jmeter.apache.org/usermanual/component_reference.html#Debug_Sampler
- 注意:
- Debug Sampler 取样器会把自定义的变量输出到响应数据,方便调试
- 压测时,需要删除Debug Sampler 取样器,避免占用客户端资源。
Http请求中文乱码的解决
测试地址:http://www.weather.com.cn/data/sk/101010100.html
1、“HTTP 请求”中Content encoding设置为utf-8。(如果插入系统是乱码)
2、添加后置处理器“BeanShell PostProcessor” prev.setDataEncoding(“utf-8”)
3、在文件jmeter.propeties修改,注意去掉#,sampleresult.default.encoding=UTF-8
Post参数设置
- Form格式参数用Parameters设置
- JSON格式参数
- 增加“配置元件”/“HTTP信息头管理器”Content-Typeapplication/json
- 在Body Data设置参数{phoneNumber":“20000000000”,“password”:“netease123”}
- Webservices接口
Content-Type application/x-www-form-urlencoded
WebService接口
WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言(通过 xml 描述)间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。在Jmeter中可以使用Http取样器来完成压测。
实例:
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=g
etSupportCity
JMeter之数据库
- 实现jdbc请求与http请求的关联
- 实验:要求遍历打印某个表某列的所有数据,需要使用“循环控制器”和“计数器”
- 多个线程使用不同的用户名,类似CSV:计数器+JDBC请求
- 同一个线程使用循环控制器+计数器
BeanShell 取样器
-
是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法
-
一种松散类型的脚本语言
-
Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器(java文件大小为175K)
-
执行标准Java语句和表达式
-
主要针对Jmeter变量的操作,可以实现调试、线程组间的通信。
-
vars:操作JMeter变量,实际引用了JMeter线程中的局部变量容器(本质是Map),连通JMeter和BeanShell,常用方法:
-
vars.get(String key) //从JMeter中获得变量值
-
vars.put(String key, String value)//数据存到JMeter变量
-
prev:获取前面的sample返回的信息,常用方法:
- getResponseDataAsString(): 获取响应信息;
- getResponseCode(): 获取响应代码;
-
log: 写入信息到日志中,log.info(“”)
1.从开发那获取jar
2.JMeter测试计划添加jar包
3.通过BeanShell Sampler进行调用并保存结果
4.在其他地方直接使用转化后的变量 ${sha}
JMeter之FTP程序
需求:
上传文件到服务器put
下载文件到本地get
sampler-> FTP 服务器
注意:“FTP请求缺省值” 的使用
逻辑控制器
逻辑控制器可以分为两类:控制取样器的执行顺序;对于脚本进行分组,方便统计结果。
简单控制器
最基本的控制器,没有任何附加作用,不参与脚本运行,可以用来命名某些操作(如采样器等)
如果(If)控制器
- 目的:判断条件,可以引用变量。
- 当为 true 时,执行子节点Interpret Condition as Variable Expression?
- 如果选择了此项,则条件必须是一个表达式,需要使用 $ {__jexl3 } 或$ {__groovy } 表达式)
- Evaluate for all children
- 勾选:对所有采样器执行前都判断一次
- 不勾选:仅入口判断一次
- 注意事项:在if逻辑控制器的Expression中不能直接填写条件表达式,需要借助函数将条件表达式计算为true/false,可以借助的函数有__jexl3__groovy函数,如果是字符串的比较,需要加””,例如:$ {__jexl3(“${gender_1}”==“男”,)}
- 表达式支持
- == 是否等于,如$ {__jexl3($ {VAR}==1,)},判断${VAR}变量是否等于1
- != 不等于,如$ {__jexl3($ {VAR}!=1,)},判断${VAR}变量是否不等于1
- ! 非,如$ {__jexl3(!($ {VAR}!=1),)}对${VAR}!=1的结果取反
- &&或|| 且与或,
${__jexl3(${VAR}==1 && “${name}”==“tom01”,)}
-
或者>== 大于等于,如$ {__jexl3(${count}>=10,)}
循环控制器
目的:循环该控制器下面字节点的次数。
线程组里循环次数设置了n次,循环控制器下的循环次数也设置了m次,则该控制器下的请求运行的次数是(n*m)次。
While控制器
- 目的:将一直运行其所有子项,直到条件为 false 为止
- Condition的可能值如下:
- 为空(不输入任何值) – 直到循环体内最后一个sampler请求失败,才会退出循环
- LAST – 直到循环前最后一个sampler请求失败,才会退出循环
- 其它 – 条件值等同于字符串"false"(等同于输入框中输入false)时,退出循环
- Condition输入框的可以输入最终计算结果等同于“false”的变量、函数。这允许使用JavaScript, BeanShell, 属性(propertie) 或变量(variable)
ForEach控制器
- 目的:遍历变量值
- 一般和用户自定义变量(User Defined Variables)一起使用,其在用户自定义变量中读取一系列相关的变量。每一个线程下执行时该控制器下的采样器或控制器都会被执行一次或多次(次数和用户变量有关)。输入应包括的几个变量,每个变量由变量名、下划线、和数字组成,每个变量必须有一个值。
交替控制器
每次循环时执行不同的请求
Switch 控制器
- 该控制器可以控制里面的请求根据某些规则,在不同数字时选择控制器下的对应数字位的不同sampler。一般可以用在模拟多线程同时操作不同请求的测试场景。
- Switch Value:设置你要访问的请求索引(从0开始的)或者直接设置访问的请求名称。数字对应的就是每个请求的顺序(注意点:第一个是0),这num可以通过计数器,counter函数,random函数来自动生成(一般常用rando函数)。
随机(顺序)控制器
- 随机控制器:其下属节点在执行中,是随机读取某一个执行的。
- 随机顺序控制器:其下的子节点全部执行,但顺序是随机的
事务控制器
- 目的:统计该控制器下面的子节点运行的时间。
- 举例:在事务控制器下面创建两个http请求和“用表格查看结果”。
- Generate parent sample,勾选上这一项后只显示控制器下面所有子节点的总共的时间。
- Include duration…generated sample:统计定时器等待的时间。如果你添加了定时器,然后勾选了这一项,则会将你定时器等待的时间也统计出来。
吞吐量控制器
- 目的:控制该控制器下面子节点运行次数。
- Total Executions:吞吐量的次数;
- Percent Executions:吞吐量占的百分比。
定时器特点
- 负责定义请求之间的延迟间隔
- 定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是之后)
- 当执行一个sampler之前时,所有当前作用域内的定时器都会被执行
- 如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入
固定定时器
如果需要让每个线程在请求之前按相同的指定时间停顿,那么可以使用这个定时器;需要注意的是,固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间。
同步定时器(Synchronizing Timer)
- 类似于loadrunner当中的集合点(rendezvous point)作用相似,其作用是:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力
- Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量
- Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数
函数助手
- 随机数 ${__Random(1,100,)} 配置元件/随机变量也可以产生随机数
- 时间 ${__time(,)}
- 唯一数 ${__UUID}
- 计数器 ${__counter(TRUE,i)}线程迭代的次数
- 实现每次调用计数器都会产生一个新值,从1开始每次累加1
- true:针对每个虚拟用户是独立的
- false:所有虚拟用户是公用的
JMeter插件安装-非GUI界面
插件安装
- 下载地址:https://jmeter-plugins.org/install/Install/
- 安装方法:
- 把jmeter-plugins-manager-1.7.jar放入/lib/ext里面,然后重启Jmeter。
- 加载插件 Option->Plugin Managger
监听器-察看结果树
- 察看结果树以树状结构组织显示所有取样器的响应。显示取样器请求和响应的细节以及请求结果,包括消息头,请求的数据,响应的数据。
- 注意: 因为生成查看结果树需要消耗大量的系统资源(CPU,内存等),负载测试期间不得使用查看结果树。
监听器-聚合报告
- 聚合报告为测试中的每个不同名称的请求创建一个表记录。
- 对于每个请求,它统计了响应信息并提供请求计数、最小值、最大值、平均值、错误率、近似吞吐量(请求/秒)和每秒千字节吞吐量。
- 在聚合报告中,各个响应时间不能超过客户的要求,就是合格,例如不能超过响应时间2s,大于2s就是不合格的。
非GUI界面启动
- 压测参数
- -h 帮助
- -n 非GUI模式
- -t 指定要运行的 JMeter 测试脚本文件
- -l 记录结果的文件 每次运行之前,(要确保之前没有运行过,即xxx.jtl不存在,不然报错)
- -r Jmter.properties文件中指定的所有远程服务器
- -e 在脚本运行结束后生成html报告
- -o 用于存放html报告的目录(目录要为空,不然报错)
- 官方配置文件地址http://jmeter.apache.org/usermanual/get-started.html
jmeter -n -t F:\jmeter-2022\ch13-bugfree-resolve.jmx -l
F:\jmeter-2022\demo2022.jtl -e -o F:\jmeter-2022\report
性能优化-注意事项
- 使用非GUI模式:jmeter -n -t test.jmx -l result.jtl
- 少使用Listener, 如果使用-l参数,可以被删除或禁用。
- 在加载测试期间不要使用“察看结果树”或“用表格察看结果”表监听器,只能在脚本阶段使用它们来调试脚本。
- 不要使用大量的相似samplers,而是循环使用一个sampler,使用参数化来达到不同sample的效果。
http://jakarta.apache.org/jmeter/usermanual/best-practices.html#lean_mean - 不要使用函数模式
- 使用CSV输出而不是XML
- 只保存你需要的数据,尽可能少地使用断言
- 尽量使用脚本语言
- 如果测试需要大量数据,可以提前准备好测试数据放到数据文件中,以CSV Read方式读取
- 用内网压测,减少其他带宽影响压测结果
- 如果压测大流量,尽量用多几个节点以非GUI模式向服务器施压
测试报告解析
Jmeter压测生成图形化HTML测试报告解析
- APDEX(Application performance Index)
- Apdex:应用程序性能指标,范围在0~1之间,1表示达到所有用户均满意
- T(Toleration threshold):可接受(容忍或满意)阈值,即用户可接受的响应时间
- F(Frustration threshold):不可接受(失败)阈值,即用户不可接受响应时间
- Over Time(随着时间的变化)
- Response Times Over Time:响应时间变化趋势
- Response Time Percentiles Over Time (successful responses):最大,最小,平均,用户响应时间分布
- Active Threads Over Time:并发用户数趋势
- Bytes Throughput Over Time:每秒接收和请求字节数变化,蓝色表示发送,黄色表示接受
- Latencies Over Time:平均响应延时趋势
- Connect Time Over Time:连接耗时趋势
- Throughput
- Hits Per Second (excluding embedded resources):每秒点击次数
- Codes Per Second (excluding embedded resources):每秒状态码数量
- Transactions Per Second:即TPS,每秒事务数
- Response Time Vs Request:响应时间和请求数对比
- Latency Vs Request:延迟时间和请求数对比
- Response Times
- Response Time Percentiles:响应时间百分比
- Response Time Overview:响应时间概述
- Time Vs Threads:活跃线程数和响应时间
- Response Time Distribution:响应时间分布图