Jmeter常用组件——断言

2024-02-04  本文已影响0人  moutory

前言

本文主要讲jmeter中关于断言组件的使用,适合已经对Jmeter有基本的使用经验的人阅读。如果还是jmeter的小白用户,建议先去看一下我的同系列入门文章,再来阅读本文。

如果对Jmeter的其他知识感兴趣,可以看我其他的相关文章:
压测工具Jmeter的安装和快速上手
JMeter进阶技巧介绍

说在前面

在使用Jmeter的过程中,我们会关心接口的调用结果是否正确,但默认情况下Jmeter只会对HTTP状态码不是200的请求标记为失败,如果相关接口的错误信息是放在响应体中的话,那么Jmeter就不能正确地将这部分没调用成功的请求给显示出来,当数据量比较大的情况下,人工去筛选出调用失败的接口很明显不太可能,所以我们需要借助Jmeter中的断言工具来协助我们定位到不符合预期的响应。
需要注意的是,Jmeter针对断言提供了类型相当丰富的断言工具,本文只会讲比较常见的断言组件。

一、响应断言

响应断言可以用响应信息的响应头、响应文本、响应代码等所有报文内容来进行判断(事实上,响应断言还可以用来检测请求的报文是否有误)

步骤1:新增响应断言

选择一个线程组新增响应断言,这里需要注意,我们也可以单独针对某个http请求来进行断言,配置在线程组的断言会对组内所有接口生效。


新增响应断言
步骤2:新增查看结果树组件

断言的使用需要配合结果树组件来进行观察


新增结果树组件
步骤3:配置响应断言

响应断言支持我们配置的条件有很多,我们可以根据需要来设置需要判断的内容,以及判断的条件

模式匹配规则
步骤4:进行验证(略)

我们执行相关的测试用例即可验证

二、JSON断言

JSON断言只能针对响应结果是applicaton/json格式的请求进行断言。虽然作用的范围相比于响应断言来说要小很多,但是JSON断言要更加灵活,它可以实现单独对某个json字段的值来进行判断。在JSON断言中,可以使用$.字段名的方式来引用响应体的字段内容。

步骤1:新增JSON断言
image.png
步骤2:配置JSON断言
步骤3:配置查看结果树

这一步和上一小节的一样,就不再复述了。

步骤4:进行验证

我们希望正确的返回结果中的responseMessage字段包含“已存在外部订单号”字眼的内容,下面我们就来通过JSON断言配置实现对应的效果。
通过配置$.responseMessage我们获取到了想要判断的字段,勾选Additionally assert valueMatch as regular expression表示我们需要开启正则表达式来进行断言判断。在Expected Value字段中我们填写了对应的正则表达式。由于不使用取反操作,所以我们的Invert assertion配置不进行勾选。
最后的配置如下图所示:

image.png
分别造出不同出参的数据,可以看到断言已经正常生效了。
image.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断言组件

新建一个BeanShell断言
步骤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:造数据进行验证

我们可以看到,结果树中已经正常将结果输出出来了。


image.png
小细节:如何查看BeanShell中的log日志

我们可以通过点击右上角的感叹号来打开日志面板


image.png
image.png

剩下的个人觉得在某些场景下比较有用的断言组件有:大小断言断言持续时间,前者可以针对响应的内容大小进行判断,后者可以根据接口的响应时间来进行判断,这个在压测或者其他特殊的场景下也有使用的场景。

参考文章
【Jmeter】断言 https://www.cnblogs.com/mumuluo/p/13960905.html

上一篇 下一篇

猜你喜欢

热点阅读