前言
在HttpRunner中,我們的測試用例都是寫在 YAML/JSON 文件中,有時候我們想借助代碼來實現某些較復雜的功能,但在 YAML/JSON 中是無法直接寫代碼來處理的,這個時候,我們可以借助 HttpRunner 中的輔助函數 debugtalk.py 來完成。
HttpRunner使用文檔中的說明:
- HttpRunner 的實現方式為,支持熱加載的插件機制(debugtalk.py),可以在 YAML/JSON 中調用 Python 函數。
- 具體地做法,我們可以在測試用例文件的同級或其父級目錄中創建一個 debugtalk.py 文件,然后在其中定義相關的函數和變量。
本人環境:HttpRunner V1.5.8
測試場景
在之前的文章 HttpRunner學習3--extract提取數據和引用 中,我們模擬的是一個學生充值金幣的接口,這個接口有權限驗證,我們需要先通過接口A登錄,然后在接口B中進行充值操作。
在這里,我們可以借助輔助函數,在 debugtalk.py 中寫python代碼實現登錄,並返回后續cookie進行身份驗證所需要的信息,最后直接在 YAML 用例腳本中進行引用。
通過Python代碼登錄獲取Cookie
首先,創建一個Python文件,文件名為 debugtalk.py ,我們需要把一個登錄函數的代碼寫到該文件中。在這里,登錄函數將直接返回后續充值操作所需要的 cookie ,格式如下:用戶名=登錄接口返回的sign,debugtalk.py 文件內容如下:
import requests
base_url = "http://api.nnzhp.cn"
def get_cookie(username="test1010", passwd="aA123456"):
url = base_url + "/api/user/login"
headers = {
"Content-Type":"application/x-www-form-urlencoded",
"User-Agent": "Fiddler"
}
body = {
"username": username,
"passwd": passwd
}
res = requests.post(url, headers=headers, data=body)
try:
sign = res.json()["login_info"]["sign"]
except:
sign = ""
cookie = "{}={}".format(username, sign)
return cookie
if __name__ == '__main__':
cookie = get_cookie()
print(cookie)
上面的代碼中,如果登錄失敗時,res.json()["login_info"]["sign"] 會提示錯誤 "KeyError" ,因此用 try...except 進行了簡單的異常處理,當登錄失敗時,返回一個 "" 空字符串。
YAML文件中引用Cookie
在 debugtalk.py 中自定義函數返回數據后,我們要怎么去引用返回的數據呢?
先在 debugtalk.py 同一目錄下創建 YAML/JSON 測試用例文件,如在YAML 測試用例中,對 debugtalk.py 中自定義的 get_cookie() 函數進行引用,可使用 ${get_cookie()} 。
Cookie: ${get_cookie()}
當然,也可以在引用的時候給函數傳參數,如果參數是固定值,則可以這樣寫 ${get_cookie(test1010, aA123456)},如果參數是變量,則是 ${get_cookie($username, $passwd)} 等。
運行用例
完整的YAML格式用例如下:
- config:
name: debugtalk test
request:
base_url: http://api.nnzhp.cn
- test:
name: add gold
request:
url: api/user/gold_add
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
Cookie: ${get_cookie()}
data:
stu_id: 2114
gold: 500
validate:
- eq: [status_code, 200]
- eq: [content.error_code, 0]
- eq: [content.msg, "操作成功!"]
接下來便可以運行用例了,得到后的報告如下: