[TOC]
断言:依靠软件程序自动判断操作结果的正确性,用于检查测试中得到的响应数据等是否符合预期。在接口测试用例中没有断言的接口用例是无效的,一个接口的断言有三个层面,一个是HTTP状态码的断言,另外一个是业务状态码的断言,最后是某一接口请求后服务端响应数据的断言
Jmeter最常用断言:Response Assertion(响应断言),Json断言,beanshell断言
>[success] ## 一:Response Assertion(响应断言)
响应断言:可选择断言验证的范围(URL,响应头,响应码,响应体,响应附件),匹配的模式(纯文本还是正则表达式匹配)
>[info] ### **1:操作响应断言:添加-断言-响应断言**
:-: ![](https://img.kancloud.cn/e7/b6/e7b6c442a37725b518728b5b46622598_593x548.png)
对web请求http状态码的断言
1.对http请求状态码的验证
:-: ![](https://img.kancloud.cn/81/02/8102af7ba3c2cd744cb4f1a1c52ba2c9_1152x720.png)
<br>
<br>
**Apply to (响应断言的应用范围)**
Main sample and sub-samples:作用于父节点取样器及对应子节点取样器
Main sample only:只作用于父节点取样器(一般的断言都选这个)
Sub-samples only:只作用于子节点取样器
JMeter Variable:只作用于jmeter变量(可写入正则提取的响应值)
**测试字段:**
响应文本:请求的响应文本信息,不包含响应头信息。最常用的断言字段
响应代码:对应http返回的响应码
响应信息:匹配响应信息
响应头:响应头信息
URL样本: 请求url,如果有重定向包含重定向url
文档(文本):通过Apache Tika从各种的文档中提取的文本进行验证,包括响应文本,pdf、word等等各种格式
忽略状态(Ignore Status): 一个请求多项响应断言时,忽略某一项断言的响应结果,而继续下一项断言
**模式匹配规则**
包括:响应的结果中包含指定的文本或者字段值,支持正则表达式
匹配:完全匹配,期望值与实际结果必须完全一致,一般结合正则表达式使用
相等:响应结果与指定的内容完全一致,不支持正则表达式
字符串:返回结果,包含指定的字符串,不支持正则表达式
否:不进行匹配
<br>
<br>
>[info] ### **2:添加断言结果,添加-监听器-断言结果**
:-: ![](https://img.kancloud.cn/a8/4e/a84e4a12f326e0110a57937c562c7372_702x586.png)
<br>
<br>
>[info] ### **3:发送请求,查看断言结果**
:-: ![](https://img.kancloud.cn/1f/8e/1f8e399c96dda257aba003a9ea79e1ef_1152x720.png)
<br>
<br>
<br>
<br>
>[success] ## **二:Json断言**
JSON断言可以对服务器返回的JSON文档进行验证。
JSON断言有两种使用模式:
1.根据JSONPath能否在JSON文档中找到路径;
2.根据JSONPath提取值并对值进行验证。
若文档格式为非JSON则断言失败;找不到路径断言失败;提取值与预期值不一致断言失败。
<br>
<br>
>[info] ### **1:添加-断言-Json断言**
:-: ![](https://img.kancloud.cn/ea/b8/eab8549d667d1c6357817ec44d43e9a5_594x526.png)
若响应数据返回是Json格式,我们可以对其进行json断言操作,在请求的察看结构树响应数据里提取数值对其进行断言,示例提取data里的phone进行断言如下
:-: ![](https://img.kancloud.cn/eb/0e/eb0ed62f79c293febcddcfba8e8c3852_1152x720.png)
:-: ![](https://img.kancloud.cn/19/c6/19c61271cce7189c2c51593ed3c5a51e_876x150.png)
可看到实际响应结果与预期不一致,故fail
<br>
<br>
<br>
<br>
>[success] ## **三:Beanshell断言**### **Bean Shell常用内置变量**
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:
**log**:写入信息到jmeber.log文件,使用方法:log.info
**ctx**:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。
**vars** - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
<br>
<br>
                         a) `vars.get(String key):`从jmeter中获得变量值
                         b) `vars.put(String key,String value):`数据存到jmeter变量中
<br>
<br>
**props** - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
<br>
<br>
                         a) `props.get("START.HMS");` 注:START.HMS为属性名,在文件jmeter.properties中定义
                         b) `props.put("PROP1","1234");
`
<br>
<br>
**prev** - (SampleResult):获取前面的sample返回的信息,常用方法:
<br>
<br>
                         a) **`getResponseDataAsString():`获取响应信息**
                         b) **`getResponseCode() :`获取响应code**
<br>
<br>
**sampler** - (Sampler):gives access to the current sampler
在这里除了可以使用beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断言结果。
:-: ![](https://img.kancloud.cn/cc/45/cc45568f2b233451cc124649822540f2_1152x720.png)
```
if ("200".equals(""+ResponseCode) == false )
{
// 响应码不等于200时,设置断言失败,并输出失败信息
Failure=true ;
FailureMessage ="Response code was not a 200 response code it was " + ResponseCode + "." ;
print ( "the return code is " + ResponseCode); // this goes to stdout
log.warn( "the return code is " + ResponseCode); // this goes to the JMeter log file
} else {
// 响应码等于200时,设置断言成功,并输出成功信息
Failure=false;
FailureMessage = "Return true, and the response code was " + ResponseCode;
}
}
```