一、安装Jmeter工具
链接:https://pan.baidu.com/s/1ZYc15eq9DO-r0ChKHxMXlg?pwd=ckcd
提取码:ckcd
--来自百度网盘超级会员V5的分享
二、Jmeter的常用元器件说明
jmeter八大元件件:取样器,前置处理器,后置处理器,断言,监听器,配置元件,逻辑控制器,定时器
1、取样器:指用来发请求的,包括http请求,JDBC请求,Websocket请求, RPC请求,部分协议可能需要自己做二次开发如mongodb压测,mq压测
2、前置处理器:指在每个请求发送之前开始执行的,一般是在取样器开始之前执行
3、后置处理器,一般是取样器执行完毕才执行,主要是处理请求后的响应,比如关联,需要把接口返回的数据存在后置处理器中
4、配置元件:元件会影响其作用范围内的所有元件,元件对其作用范围内的每一个sampler有效,主要包括http信息头管理器,cookie管理器等
5、断言:主要指响应断言,json断言等,元件对其作用范围内的每一个sampler元件执行后的结果校验,可以添加多个断言
6、 监听器:元件收集其作用范围的每一个取样器的信息并呈现
7、逻辑控制器:元件只对其子节点的取样器有效
8、定时器:元件对其作用范围内的每一个取样器有效
关于元器件的执行顺序:
在同一作用域名范围内,测试计划中的元件按照如下顺序执行。
(1)配置元件(config elements )
(2)前置处理程序(Per-processors)
(3)定时器(timers )
(4)取样器(Sampler)
(5)后置处理程序(Post-processors) (除非Sampler 得到的返回结果为空)。
(6)断言(Assertions)(除非Sampler 得到的返回结果为空)。
(7)监听器(Listeners)(除非Sampler 得到的返回结果为空)。
关于执行顺序,有两点需要注意,避免踩坑:
* 前置处理器、后置处理器和断言等元件只能对取样器作用,如果在它们的作用域内没有任何取样器,则不会被执行
* 如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行
三、接口设计,断言设计
1、接口设计,测试字段(Field to test):表示在何种内容中匹配预期字段,一般选择响应文本。
① 响应文本:接口的Response的全部数据
② 响应代码:取样器结果中的Response code,常见的有200(成功)、302(重定向)、404(不存在)、400(参数错误)、500(服务器错误)等。但当我们要验证404,501等http响应代码时,需要勾选 ignore status,因为当http响应代码为404、500时,JMeter会默认这个请求是失败的。
③ 响应信息:取样器结果中的Response message
④ 响应头:响应数据的Response headers
⑤ 请求头:请求的Request headers
⑥ URL样本:有跟随重定向时,URL样本包含了请求的URL和重定向的URL,否则只包含请求URL。
额外知识点:
模式匹配规则(Pattern Matching Rules):即响应数据与预期值的对比方式。
① 包括(Contains):响应数据包含预期值(相当于String的contains方法),则判定接口成功。支持正则匹配。
② 匹配(Matches): 用正则表达式匹配返回结果,且必须能匹配整个返回值,而不是返回值的一部分。
③ 相等(Equals):响应数据与预期值完全相同才判定接口成功。不支持正则表达式。
④ 字符串(Substring):与【包括】类似,但不支持正则匹配。
⑤ 否(Not):取反,也就是前面【包括】等判定结果为true,断言结果为false。反之,前面判定为false,断言结果为true。
⑥ 或者(Or):勾选此项后,可以设置多个预期值,只要有一项判定成功,则断言判定成功。
⑦ 测试模式(Patterns to test):预期值表达式,可以是正则表达式,也可以是字符串。可以通过【添加】按钮添加一个或多个,有多个的话,不勾选【模式匹配规则】中的【或者】,则为并集模式,即全部匹配成功才断言成功。
⑧ 自定义失败消息(Custom failure message):当判断返回值为错误的时候,自定义的失败消息会在断言结果中显示。
实战例子:
① 请求百度
② 响应数据
③ 在【百度一下】请求下添加响应断言:
④ 执行请求,查看结果树:
结果被标红,接口判定为失败。可见,你预设的断言决定了接口是否被判定成功。把上面断言中的“百度两下”改为“百度一下”,再次执行,则接口判定为成功。
⑤ JSON断言针对响应结果是applicaton/json格式的请求进行断言。
⑥ 在取样器下右键–>添加–>断言–>JSON断言,就创建了一个JSON断言,界面如下:
下面进行一个实例演练
首先,创建一个Beanshell取样器模拟接口,返回JSON数据。
return "{\"code\":0,\"message\":\"操作成功\",\"data\":{\"student\":[{\"name\":\"zhangxu\",\"age\":18},{\"name\":\"zhoushuang\",\"age\":18},{\"name\":\"changhua\",\"age\":17}]}}";
在该取样器下添加JSON断言
这里解释一下【JSON Path expression】的写法,首先$.这部分是固定写法,后面根据层级关系去逐级获取数据。
1、$.data表示在JSON串以"data"为key获取value,也就是{“student”:[{“name”:“zhangxu”,“age”:18},{“name”:“zhoushuang”,“age”:18},{“name”:“changhua”,“age”:17}]}。
2、$.data.student对应的是[{“name”:“zhangxu”,“age”:18},{“name”:“zhoushuang”,“age”:18},{“name”:“changhua”,“age”:17}],因此要通过索引定位到数组中的具体对象,也就是$.data.student[0]获取到了{“name”:“zhangxu”,“age”:18}
3、$.data.student[0].name就定位到了“zhangxu”这个值。
运行脚本,察看结果树显示接口成功。
如果我们把Expected value改为"zhangxuhahha",再次运行,发现接口被判定失败:
BeanShell断言
这种断言是应对复杂校验的利器,为什么这么说呢?因为BeanShell断言可以写较复杂的逻辑判断来对结果进行校验。
还以上边接口中的模拟接口为例,创建一个Beanshell断言:
运行脚本,察看结果树:
上边只是一个非常简单的示例
大小断言 & 断言持续时间
大小断言:判断响应结果选定部分的字节大小是否与预期的值相符。
断言持续时间:判断接口的响应时间是否小于等于设定值。
四、数据依赖,关联处理
举例说明:系统的其他功能需要登录接口返回的token或者sessionid(后面的接口需要用到前面接口返回的信息)
- json格式信息提取
①将返回的数据使用json path tester转化为json格式,使用JSON Path Expression,提取返回json数据的表达式有绝对路径和相对路径之分:
绝对路径: . 变 量 名 相 对 路 径 : .变量名 相对路径: .变量名相对路径:…变量名
如果是嵌套的数据,使用.一级级往里面取就行了,例如:{“key1”:{“key2”:{“key3”:“xxxxx”}}},提取式:$.key1.key2.key3,如果是这种格式的{“data”:[{“key1”:“value1”,“key2”:“value1”},
{“key3”:“value1”,“key4”:“value1”}
]}
提取表达式需要根据下标取提取:$data[下标值].key
上面的数据格式如果使用绝对路径提取表达式写为: . d a t a [ 1 ] . k e y 3 相 对 路 径 的 提 取 表 达 式 写 为 : .data[1].key3 相对路径的提取表达式写为: .data[1].key3相对路径的提取表达式写为:…key3
②将数据提取出来后,在需要依赖上个接口数据的接口请求中,添加–后置处理器–JSON取样器
③提取单个值:在需要提取返回数据的接口下添加json提取器(例如充值接口需要提取登录接口中需要的数据,那么就需要在登录接口中添加json提取器,自己第一次将json提取器添加到充值接口中,导致提取不到数据,实际就是json 提取器添加错了)
将json提取器添加到登录接口,就可以提取登录后的token值了(注意:要提取哪个接口的返回的数据,就添加在哪个接口下)
json表达式相对路径和绝对路径,第一种方式
.
d
a
t
a
.
t
o
k
e
n
i
n
f
o
.
t
o
k
e
n
;
第
二
种
.data.token_info.token ;第二种
.data.tokeninfo.token;第二种…token
将登录接口中提取的token值,将表达式放在充值接口中,下次充值接口发送请求就会携带token信息
充值接口发送请求后会携带token信息,请求成功
④提取多个值:提取表达式之间使用;间隔开,一定要设置默认的值,不然会导致数据提取不出来,如果取不到值那么就会返回设置的默认值。
2.正则表达式提取器
经常有接口可能返回这种类型数据,我们需要提取data中的某个key的值,因为data对应的值是字符串格式的,那么这时候就只能使用正则表达式提取器提取其中的信息。
例如要提取返回相应数据中的code的值
在正则表达式提取器中,设置引用名称,填写正则表达式,模板:
1
1
1代表去第一个括号的值
提取多个值
提取成功,但是提取的两个值进行拼接后赋值给了recode,如果要将两个值单独拿出来使用,使用:变量名_g1,变量名_g2方式获取值,使用recode_g1和recode_g2,这两个数据是将recode的数据进行拆分所以可以单独使用
五、常用插件应用
以下插件都需要自己百度下载安装成功后才会在Jmeter展示
1、jmeter-plugins.org
启动jemter,点击选项,最下面的一栏,如下图所示:
打开后界面如下:
Installed Plugins(已安装的插件):即插件jar包中已经包含的插件,可以通过选中勾选框,来使用这些插件;
Available Plugins(可下载的插件):即该插件扩展的一些插件,可以通过选中勾选框,来下载你所需要的插件;
Upgrades(可更新的插件):即可以更新到最新版本的一些插件,一般显示为加粗斜体,可以通过点击截图右下角的Apply Changes and Restart Jmeter按钮来下载更新;
PS:一般不建议进行更新操作,因为最新的插件都有一些兼容问题,而且很可能导致jmeter无法使用(经常报加载类异常)!!!
2、Transactions per Second
即TPS:每秒事务数,性能测试中,最重要的2个指标之一。该插件的作用是在测试脚本执行过程中,监控查看服务器的TPS表现————比如整体趋势、实时平均值走向、稳定性等。
jmeter本身的安装包中,监视器虽然提供了比如聚合报告这种元件,也能提供一些实时的数据,但相比于要求更高的性能测试需求,就稍显乏力。
通过上面的下载地址下载安装好插件后,重启jmeter,从监视器中就可以看到该插件,如下图所示
某次压力测试TPS变化展示图:
3、Response Times Over Time
即TRT:事务响应时间,性能测试中,最重要的两个指标的另外一个。该插件的主要作用是在测试脚本执行过程中,监控查看响应时间的实时平均值、整体响应时间走向等。
使用方法如上,下载安装配置好插件之后,重启jmeter,添加该监视器,即可实时看到实时的TRT数值及整体表现。
某次压力测试TRT变化展示图:
4、PerfMon Metrics Collector
即服务器性能监控数据采集器。在性能测试过程中,除了监控TPS和TRT,还需要监控服务器的资源使用情况,比如CPU、memory、I/O等。该插件可以在性能测试中实时监控服务器的各项资源使用。
将ServerAgent-2.2.1.jar上传到被测服务器,解压,进入目录,Windows环境,双击ServerAgent.bat启动;
linux环境执ServerAgent.sh启动,默认使用4444端口。
如出现如下图所示情况,即表明服务端配置成功:
①、服务端启动校验
CMD进入命令框,观察是否有接收到消息,如果有,即表明ServerAgent成功启动。
②、客户端监听测试
给测试脚本中添加jp@gc - PerfMon Metrics Collector监听器,然后添加需要监控的服务器资源选项,启动脚本,即可在该监听器界面看到资源使用的曲线变化。如下图所示:
在脚本启动后,即可从界面看到服务器资源使用的曲线变化,Chart表示主界面显示,Rows表示小界面以及不同资源曲线所代表的颜色,Settings表示设置,可选择自己需要的配置。
PS:注意测试脚本需要持续运行一段时间,才可以看到具体的曲线变化,否则ServerAgent端会断开连接!
六、常用的逻辑控制器(事务控制器,循环控制器)
1、事务控制器
1.1 打开方式:
鼠标右键)线程组—>(鼠标悬停)添加—>(鼠标悬停)逻辑控制器—>(左键点击)事务控制器。 如下图所示:
1.2 参数详解
我们在控制器里面会看到2个勾选框,我们来一起看下这个框有什么作用,如下图所示:
Generate parent sample :
不勾选:当不勾选的时候,这里就是会和平常执行http请求没啥2样,在我们通过聚合报告查看结果的时候,有多少个http请求上面就有多少个结果,互补干预
勾选:将逻辑处理器下面的http请求当成一个整体来统计,我们在聚合报告或其他的一些监控功能的时候,看到的就只有一条数据,哪怕你在处理器下添加了100条http请求,在统计的时候也是算一条
lnclude duration of timer and pre-post processors in generates sample:
不勾选:啥事没有
勾选:问题就来了,当勾选后,我们执行的时候,可能会加一些计时器啊等一些占用时间的插件,但是,这个时间是属于接口的执行时间吗,当然不是,但是,当你勾选后,jmeter就会把这个时间统计成接口执行的时间了,所以,这里如果没有特殊需求的话,还是别选好。
2、循环控制器
2.1打开方式
鼠标右键)线程组—>(鼠标悬停)添加—>(鼠标悬停)逻辑控制器—>(左键点击)循环控制器。 如下图所示:
2.2 参数详解
里面就2个参数,勾选永远的话,控制器下面的请求一直都在执行,如果不勾选永远,选择输入数字,那控制器下的请求就根据你输入的次数来执行多少次。很简单的控制器。运用场景很广