[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;
}
}
```