這裡有愛,有分享,有工程師們的成長日記,點藍字「軟體測試面試匯總」進行關注,微信公眾號TestMadman
1 斷言是什麼什麼是斷言?在接口測試中,我們預設接口響應結果中會出現一個片段,我們稱之為預期值,斷言會在接口調用後嘗試捕捉這個預期值,如果能捕捉到,則判定接口成功,否則判定接口為失敗。用過loadrunner的朋友一定記得檢查點這個概念,斷言和檢查點實質上是一樣的。
為什麼需要斷言?因為JMeter默認接口響應碼200即為成功:
其實,接口的業務並非成功。
為了甄別接口是否實現業務上的成功,我們便需要引入斷言。
在取樣器上右鍵–添加–斷言,可以看到,JMeter提供了豐富的斷言實現(JMeter版本:5.1.1,下同)
2.1 響應斷言這大概是最常用的斷言了。
創建方式:在線程組或者HTTP請求上右鍵–>添加–>斷言–>響應斷言,就創建了一個斷言:
關於斷言的作用域:在線程組上創建斷言,則該斷言對線程組下所有取樣器生效,而在取樣器上創建,則只對該取樣器生效。
一般情況下,我們用默認配置即可。各個項目也簡略解釋一下。
響應文本:接口的Response的全部數據
響應代碼:取樣器結果中的Response code,常見的有200(成功)、302(重定向)、404(不存在)、400(參數錯誤)、500(伺服器錯誤)等。但當我們要驗證404,501等http響應代碼時,需要勾選 ignore status,因為當http響應代碼為404、500時,JMeter會默認這個請求是失敗的。
響應信息:取樣器結果中的Response message
響應頭:響應數據的Response headers
請求頭:請求的Request headers
URL樣本:有跟隨重定向時,URL樣本包含了請求的URL和重定向的URL,否則只包含請求URL。
模式匹配規則(Pattern Matching Rules):即響應數據與預期值的對比方式。
1.包括(Contains):響應數據包含預期值(相當於String的contains方法),則判定接口成功。支持正則匹配。
2.匹配(Matches):用正則表達式匹配返回結果,且必須能匹配整個返回值,而不是返回值的一部分。
3.相等(Equals):響應數據與預期值完全相同才判定接口成功。不支持正則表達式。
4.字符串(Substring):與【包括】類似,但不支持正則匹配。
5.否(Not):取反,也就是前面【包括】等判定結果為true,斷言結果為false。反之,前面判定為false,斷言結果為true。
6.或者(Or):勾選此項後,可以設置多個預期值,只要有一項判定成功,則斷言判定成功。
測試模式(Patterns to test):預期值表達式,可以是正則表達式,也可以是字符串。可以通過【添加】按鈕添加一個或多個,有多個的話,不勾選【模式匹配規則】中的【或者】,則為併集模式,即全部匹配成功才斷言成功。
自定義失敗消息(Custom failure message):當判斷返回值為錯誤的時候,自定義的失敗消息會在斷言結果中顯示。
下面用看一個小例子。
請求百度:
響應數據:
在【百度一下】請求下添加響應斷言:
執行請求,查看結果樹:
結果被標紅,接口判定為失敗。可見,你預設的斷言決定了接口是否被判定成功。把上面斷言中的「百度兩下」改為「百度一下」,再次執行,則接口判定為成功。
JSON斷言針對響應結果是applicaton/json格式的請求進行斷言。
在取樣器下右鍵–>添加–>斷言–>JSON斷言,就創建了一個JSON斷言,界面如下:
Assert JSON PATH exists:針對響應結果中特定欄位進行提取的路徑表達式。
Additionally assert value:附加斷言值,勾選此項後才能填寫Expected value。
Match as regular expression:作為正則表達式匹配。
Expected value:預期值,這個值將與Assert JSON PATH exists提取到的值對比,一致則判定接口成功。
下面照例進行一個實例演示。
首先,創建一個Beanshell取樣器模擬接口,返回JSON數據。
return "{\"code\":0,\"message\":\"操作成功\",\"data\":{\"student\":[{\"name\":\"zhangxu\",\"age\":18},{\"name\":\"zhoushuang\",\"age\":18},{\"name\":\"changhua\",\"age\":17}]}}";
在該取樣器下添加JSON斷言,照下圖寫入:
這裡解釋一下【JSON Path expression】的寫法,首先$.這部分是固定寫法,後面根據層級關係去逐級獲取數據。
1、$.data表示在JSON串以"data"為key獲取value,也就是{「student」:[{「name」:「zhangxu」,「age」:18},{「name」:「zhoushuang」,「age」:18},{「name」:「changhua」,「age」:17}]}。
2、$.data.student對應的是[{「name」:「zhangxu」,「age」:18},{「name」:「zhoushuang」,「age」:18},{「name」:「changhua」,「age」:17}],因此要通過索引定位到數組中的具體對象,也就是$.data.student[0]獲取到了{「name」:「zhangxu」,「age」:18}
3、$.data.student[0].name就定位到了「zhangxu」這個值。
運行腳本,察看結果樹顯示接口成功。
如果我們把Expected value改為"zhangxu2",再次運行,發現接口被判定失敗:
2.3 BeanShell斷言這種斷言是應對複雜校驗的利器,為什麼這麼說呢?因為BeanShell斷言可以寫較複雜的邏輯判斷來對結果進行校驗。
還以2.2中的模擬接口為例,創建一個Beanshell斷言:
運行腳本,察看結果樹:
當然,這只是一個簡單的示例,更豐富的用法請見:JMeter BeanShell Sampler與JMeter BeanShell斷言
大小斷言:判斷響應結果選定部分的字節大小是否與預期的值相符。
斷言持續時間:判斷接口的響應時間是否小於等於設定值。
文章來源:https://blog.csdn.net/mu_wind/article/details/108204489
歡迎同學們掃描二維碼報名吧!
快,關注這個公眾號,一起漲姿勢~
IT測試人的自媒體
微信號:Tester006
QQ : 869120106
長按二維碼關注吧
一起成長,一起分享,希望能對您有所幫助,我們是TestMadman,期待您的關注。