前言
本文主要讲jmeter中关于断言组件的使用,适合已经对Jmeter有基本的使用经验的人阅读。如果还是jmeter的小白用户,建议先去看一下我的同系列入门文章,再来阅读本文。
如果对Jmeter的其他知识感兴趣,可以看我其他的相关文章:
压测工具Jmeter的安装和快速上手
JMeter进阶技巧介绍
说在前面
在使用Jmeter的过程中,我们会关心接口的调用结果是否正确,但默认情况下Jmeter只会对HTTP状态码不是200的请求标记为失败,如果相关接口的错误信息是放在响应体中的话,那么Jmeter就不能正确地将这部分没调用成功的请求给显示出来,当数据量比较大的情况下,人工去筛选出调用失败的接口很明显不太可能,所以我们需要借助Jmeter中的断言工具来协助我们定位到不符合预期的响应。
需要注意的是,Jmeter针对断言提供了类型相当丰富的断言工具,本文只会讲比较常见的断言组件。
一、响应断言
响应断言可以用响应信息的响应头、响应文本、响应代码等所有报文内容来进行判断(事实上,响应断言还可以用来检测请求的报文是否有误)
步骤1:新增响应断言
选择一个线程组新增响应断言,这里需要注意,我们也可以单独针对某个http请求来进行断言,配置在线程组的断言会对组内所有接口生效。
![](https://img.haomeiwen.com/i24009055/7d30716ccc745bab.png)
步骤2:新增查看结果树组件
断言的使用需要配合结果树组件来进行观察
![](https://img.haomeiwen.com/i24009055/d2831701061873d9.png)
步骤3:配置响应断言
响应断言支持我们配置的条件有很多,我们可以根据需要来设置需要判断的内容,以及判断的条件
模式匹配规则
- 包括:可以指定测试字段的值是否包含指定文本
- 匹配:其实就是正则匹配,我们可以通过定义正则表达式来定义符合要求的响应
- 相等:相当于是完整匹配,测试字段的文本必须和给定的文本完全一致
- 字符串:这个和包含比较类型,用来判断测试字段的值是否包含指定文本
- 否:用于逻辑取反
-
或者:用于逻辑取或
image.png
步骤4:进行验证(略)
我们执行相关的测试用例即可验证
二、JSON断言
JSON断言只能针对响应结果是applicaton/json格式的请求进行断言。虽然作用的范围相比于响应断言来说要小很多,但是JSON断言要更加灵活,它可以实现单独对某个json字段的值来进行判断。在JSON断言中,可以使用$.字段名
的方式来引用响应体的字段内容。
步骤1:新增JSON断言
![](https://img.haomeiwen.com/i24009055/4576a9925433d348.png)
步骤2:配置JSON断言
- Assert Json path exists:json提取表达式,即表达式提取到的内容为断言内容。支持
$.字段名
来进行匹配 - Additionally assert value:勾选后方可填写断言内容
- Match as regular expression:勾选后表示断言内容支持正则表达式
- Expected Value:断言内容
- Except null:勾选后表示断言内容为空,也就说断言的内容不会再生效了
-
Invert assertion(wiil fail if above condition met):断言取反,即如果断言结果为true,则勾选后断言结果为false;如果断言结果为false,则勾选后断言结果为true
image.png
步骤3:配置查看结果树
这一步和上一小节的一样,就不再复述了。
步骤4:进行验证
我们希望正确的返回结果中的responseMessage
字段包含“已存在外部订单号”字眼的内容,下面我们就来通过JSON断言配置实现对应的效果。
通过配置$.responseMessage
我们获取到了想要判断的字段,勾选Additionally assert value
和Match as regular expression
表示我们需要开启正则表达式来进行断言判断。在Expected Value
字段中我们填写了对应的正则表达式。由于不使用取反操作,所以我们的Invert assertion
配置不进行勾选。
最后的配置如下图所示:
![](https://img.haomeiwen.com/i24009055/3464ff95a26b76f6.png)
分别造出不同出参的数据,可以看到断言已经正常生效了。
![](https://img.haomeiwen.com/i24009055/13ee80760fac74fb.png)
三、BeanShell断言
BeanShell
算是个性化程度最高的一类断言了,这个组件支持我们通过写脚本的方式来自定义断言校验的字段,以及相关的输出内容
(一)断言的内置变量和方法
Beanshell
有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,比如:
prInt:非GUI模式下打印信息(输出信息到stdout)
log:输出信息到日志(文件)
log.debu("调试信息")
log.info("响应状态码" + ResponseCode)
log.warn("警告信息")
log.error("出错信息")
ResponseCode:响应状态码(String类型)
ResponseHeaders:响应头(String类型)
prev:获取当前请求结果
prew.getResponseDataAsString():获取响应体数据(String类型)
prew.getResponseCode():获取状态码(同ResponseCode,String类型)
vars: 操作jmeter变量
String var1 = vars.get("变量名"):获取变量的值(假设为String类型)
vars.put("变量名", 变量值):设置变量值
props: 操作JMeter属性
props.get(String,String) 可以获取Jmeter中已经生成的属性
props.put(String,String) 可以创建和更新Jmeter属性
ctx:获取当前线程上下文数据(可获取所有信息)
ctx.getVariables("变量名"):获取变量值(同vars.get())
ctx.setVariables("变量名", "变量值"):设置变量(同vars.put())
ctx.getProperties("属性名"):获取属性值(同props.get())
ctx.setProperties("属性名","属性值"):设置属性(同props.put())
ctx.getPreviousResult():获取当前请求结果同(prev)
ctx.getCurrentSampler():获取当前采样器
ctx.getPreviousSampler():获取前一采样器
ctx.getThreadNum():获取线程数
ctx.getThreadGroup():获取线程组
ctx. getThread():获取当前线程
ctx.getEngine():获取引擎
ctx.isSamplingStarted():判断采样器是否启动
ctx.isRecording():判断是否开启录制
ctx.getSamplerContext():获取采样器山下文数据
关于BeanShell断言的更多变量,可以从官方文档进行查阅:Jmeter 官方BeanShell断言讲解
(二)使用BeanShell
来做一个案例
步骤1:定义一个BeanShell
组件
在请求下面新建一个BeanShell
断言组件
![](https://img.haomeiwen.com/i24009055/4d4db1e96f0bcb5b.png)
步骤2:定义断言内容
//获取响应内容
String response_value = prev.getResponseDataAsString();
//获取响应码
response_code = prev.getResponseCode();
// 输出一下日志
log.error("http响应码:"+response_code);
log.error("response响应体为:"+response_value);
//断言内容,如果是做接口自动化时,可以直接读取csv文件的断言内容
//这里只是单接口调试而已,因此,就自定义两个断言的变量来存放断言内容。
String assert1 = "\"responseCode\":\"00\"";
//Failure是jmeter内置的变量,为false时,表示断言成功,不会抛出错误,为true时,表示断言失败;
//FailureMessage是jmeter内置的变量,用来打印断言失败后,需要显示的内容。
if(response_value.contains(assert1)){
Failure = false;
return;
}else{
Failure=true;
String massage = "\n\t\t断言失败!" +"\n" + "断言1:"+assert1 +"\t";
FailureMessage=massage+"响应码为:"+ response_code+"\n"+"响应内容为:"+response_value;
return ;
}
步骤3:定义查看结果树组件
和原先的步骤一致,此处略
步骤4:造数据进行验证
我们可以看到,结果树中已经正常将结果输出出来了。
![](https://img.haomeiwen.com/i24009055/4999126bcf4e7ca2.png)
小细节:如何查看BeanShell中的log日志
我们可以通过点击右上角的感叹号来打开日志面板
![](https://img.haomeiwen.com/i24009055/bd2c744657a67c56.png)
![](https://img.haomeiwen.com/i24009055/0645880f888a8fbc.png)
剩下的个人觉得在某些场景下比较有用的断言组件有:大小断言、断言持续时间,前者可以针对响应的内容大小进行判断,后者可以根据接口的响应时间来进行判断,这个在压测或者其他特殊的场景下也有使用的场景。
参考文章
【Jmeter】断言 https://www.cnblogs.com/mumuluo/p/13960905.html
网友评论