目录
在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言。断言相当于检查点,用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过。
响应断言
响应断言 :对服务器的响应进行断言校验
作用对象:响应报文中的所有对象
增加断言: 线程组 -> 添加 -> 断言 -> 响应断言
APPly to(适用范围)
Main sample and sub-samples:作用于父节点取样器及对应子节点取样器
Main sample only:仅作用于父节点取样器
Sub-samples only:仅作用于子节点取样器
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
测试字段
响应文本
响应代码
响应信息
响应头
URL样本
文档(文本)
忽略状态
请求数据
模式匹配规则
包括
返回结果包括指定的内容,支持正则匹配。
例如断言为:1、invalid 2、[a-z]+
当返回值为:{"msg":"channel invalid."} , 这两个断言都是ok的,返回true
匹配
1、相当于equals。当返回值固定时,可以返回值做断言,效果和equals相同。
2、正则匹配。用正则表达式匹配返回结果,但必须全部匹配。即正则表达式必须能匹配整个返回值,而不是返回值的一部分。
例如断言为:1、{"msg":"channel invalid."} 2、\{"msg":"[a-z]+ invalid\."\} 3、[a-z]+
当返回值为:{"msg":"channel invalid."} ,断言1 2 是ok的, 断言3是false,
当返回值为:{"msg":"channel invalid."} , 断言1 3是false, 断言2才是ok的。
原因是,断言1 只能用于equals,而断言3 只匹配了返回值部分,而不是全部匹配。
Equals
返回结果与你指定断言完全一致
SubString
与 “包括”差不多,都是指返回结果包括指定的内容,但是subString不支持正则字符串。
例如断言为:1、invalid 2、[a-z]+
当返回值为:{"msg":"channel invalid."} , 断言1返回true, 但断言2返回false。
否
相当于取反。如果上面断言结果为true,勾选“否”后,最终断言结果为false。如果上面断言结果为false,勾选“否”后,则最终断言结果为 true。
或者
响应报文中包含下面填写的"要测试模式"的其中之一即可。
断言结果
添加断言结果监听:线程组 -> 添加 -> 监听器 -> 断言结果
执行线程组,查看结果,绿线为执行成功的效果,红线为执行失败的效果。
JSON断言
对判断某个请求执行状态(成功/失败),且响应为JSON格式时,就可以使用JSON断言。
增加断言: 线程组 -> 添加 -> 断言 -> JSON断言
断言结果示例
大小断言
判断响应结果是否包含正确数量的byte。可定义(=, !=, >, <, >=, <=)。
持续时间断言
判断是否在给定的时间内返回响应结果。
Bean Shell断言
在BeanShell中,可以使用java语言自定义函数来处理特定的逻辑,结合BeanShell的内置
对象进行变量的存取,提高脚本的灵活性。
什么是Bean Shell
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法。
BeanShell是一种松散类型的脚本语言(这点和JS类似)。
BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器。
BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
Bean Shell常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:
log
写入信息到jmeter.log文件,使用方法:log.info(“This is log info!”);
vars
操作变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
1、 vars.get(String key):从JMeter中获得变量值
2、 vars.put(String key,String value):数据存到JMeter变量中
props
操作属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
1、props.get("START.HMS");
注:START.HMS为属性名,在文件jmeter.properties中定义
2、props.put("PROP1","1234");
prev
获取前面的sample返回的信息,常用方法:
1、getResponseDataAsString():获取响应信息
2、getResponseCode() :获取响应code
引用外部文件
引用外部java文件
在BeanShell中通过 source("java文件路径") 方法引入java,然后调用方法和java一样,new一个class,再调用里面的方法。
引用外部class文件
用 addClassPath("class文件路径") 方法引入class文件,再用import导入包及类,然后就可以像java一样调用了。
引用外部Jar包
把jar包放到JMeter的lib目录下。
使用示例
使用JSONObject对象来获取json数据,进行断言和数据处理。
首先需要下载org.json的jar包
(https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav),
然后在测试计划中导入该jar包,并在JMeter的lib目录下放入该jar包。
示例1:
验证retCode的值是否等于200:
import org.json.*;
//获取上一个请求的返回
String jsonString = prev.getResponseDataAsString();
JSONObject responseJson = new JSONObject(jsonString);
//判断返回值是否和预期一致
if (responseJson.getInt("retCode") != 200) {
//把断言失败置为真,即用例失败,并在结果树中显示FailureMessage
Failure = true;
FailureMessage = "retCode的返回值有误";
}
示例2:
验证respone中retMsg的值是否与预期一致:
import org.json.*;
//获取上一个请求的返回
String jsonString = prev.getResponseDataAsString();
JSONObject responseJson = new JSONObject(jsonString);
//判断返回值是否和预期一致
String retMsg = responseJson.getString("retMsg");
if (!retMsg.equals("result_success")) {
//把断言失败置为真,即用例失败,并在结果树中显示FailureMessage
Failure = true;
FailureMessage = "retMsg与实际值不一致";
}
示例3:
使用变量进行断言:
添BeanShell 后置处理器
import org.json.*;
//获取上一个请求的返回值
String response = prev.getResponseDataAsString();
//将返回值转换为json
JSONObject responseJson = new JSONObject(response);
//获取responseMessage
String message = responseJson.getString("retMsg");
log.info("message的值:" + message);
//使用vars.put()方法储存变量message
vars.put("message",message);
在后面如需要使用变量message,可以使用${message}来获取变量的值。
可以添加调试取样器,在结果树中查看变量是否被取到。
变量储存好后,在需要断言的接口后面添加BeanShell断言,使用Failrue来标识断言失败,FailureMessage标示断言失败的原因,如:
//使用vars.get()方法获取变量的值
String message= vars.get("message");
if(!message.equals("result_success")) {
Failure = true;
FailureMessage = "规则解析失败";
}else{
FailureMessage = "规则解析成功";
}