[TOC]
断言:依靠软件程序自动判断操作结果的正确性,用于检查测试中得到的响应数据等是否符合预期。在接口测试用例中没有断言的接口用例是无效的,一个接口的断言有三个层面,一个是HTTP状态码的断言,另外一个是业务状态码的断言,最后是某一接口请求后服务端响应数据的断言
Jmeter最常用断言:Response Assertion(响应断言),Json断言,beanshell断言
>[success] ## 一:Response Assertion(响应断言)
响应断言:可选择断言验证的范围(URL,响应头,响应码,响应体,响应附件),匹配的模式(纯文本还是正则表达式匹配)
>[info] ### **1:操作响应断言:添加-断言-响应断言**
:-: 
对web请求http状态码的断言
1.对http请求状态码的验证
:-: 
<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:添加断言结果,添加-监听器-断言结果**
:-: 
<br>
<br>
>[info] ### **3:发送请求,查看断言结果**
:-: 
<br>
<br>
<br>
<br>
>[success] ## **二:Json断言**
JSON断言可以对服务器返回的JSON文档进行验证。
JSON断言有两种使用模式:
1.根据JSONPath能否在JSON文档中找到路径;
2.根据JSONPath提取值并对值进行验证。
若文档格式为非JSON则断言失败;找不到路径断言失败;提取值与预期值不一致断言失败。
<br>
<br>
>[info] ### **1:添加-断言-Json断言**
:-: 
若响应数据返回是Json格式,我们可以对其进行json断言操作,在请求的察看结构树响应数据里提取数值对其进行断言,示例提取data里的phone进行断言如下
:-: 
:-: 
可看到实际响应结果与预期不一致,故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来设置断言结果。
:-: 
```
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;
}
}
```
