背景
上一篇關於 JMeter 的多接口測試,雖說可以把幾個步驟的串聯起來,但是會比較簡單和單調。
還有許多業務場景,會根據上一個接口的返回,再決定要不要調用第二個接口或者是掉用其他接口。
還是拿大家常見的查詢訂單舉個例,首先可以是查詢訂單列表,然後再查訂單詳情。
試想一下如果訂單列表是空,還有必要再查詢訂單詳情嗎?
其實再查詢訂單詳情其實意義已經不大了,畢竟真實的用戶路徑也不會有這一步。
對這種類型的場景,就需要藉助 If 控制器 (If Controller) 來完成了。
顧名思義,這個 If 控制器幾乎等價於我們寫代碼用的最多的 if 關鍵字。
它可以通過條件來控制是否運行其下面的測試元件(子元素)。
下面來看一個具體的例子來了解一下。
場景接口
在這裏的話,老黃沒有虛擬一個場景,用的是接口A,接口B和接口C來代替。
它們的流程大概如下:
- 調用接口 A,會返回一個 data 字段,是 2 的餘數,取值 0 或 1
- 如果接口 A 返回的 data 是 0,會去調用接口 B
- 如果接口 A 返回的 data 是 1,會去調用接口 C
下面是各接口定義
接口 A
請求:
GET http://localhost:8532/If/a
Content-Type: application/json
響應:
{"code":0,"msg":"ok","data":0}
接口 B
請求:
GET http://localhost:8532/If/b?data=xxx
Content-Type: application/json
響應:
{"code":0,"msg":"ok","data":0}
接口 C
請求:
GET http://localhost:8532/If/c
Content-Type: application/json
響應:
{"code":0,"msg":"ok","data":"c"}
接口 A 處理
添加一個 HTTP 請求,進行相關的參數設定。
同時還要添加一個 JSON Extractor 的後置處理器
到這裏的話,接口 A 就可以了。
下面就是用 If 控制器去區分調用 接口 B 和接口 C 了
IF 處理
在線程組直接添加一個 If 控制器。
比較重要的是填寫裏面的表達式。
可以看到上面有一個小小的感嘆號,其實也就是提醒我們儘可能用 __jexl3
或 __groovy
來判斷 true 和 false。
然後就是 If 控制器下面的添加正常的 HTTP 請求了。
最後再加個斷言
接口 C 就是同理了,變的就是 If 控制器裏面的表達式。
爲了演示接口 A 返回的 data 會出現 0 和 1 ,所以加一個循環控制器來進行多次請求。
到這裏的話,所有 Jmeter 的內容已經完成了。
下面是測試計劃最終的樣子。
跑起來大概會像下面這樣:
可以看到 A 請求後面的 B 和 C 是沒有規律的,它們是依據 A 的返回結果變化而變化的。
寫在最後
If 控制器可以很好的銜接多個有條件關係的接口測試。
老黃把 JMeter 系列的內容都放在 github 了,方便大家查閱和測試。