L03_HttpRunner的hook(鈎子)機制:(setup/teardown)對請求和響應内容進行預處理
有些系統登入頁面輸入使用者名和密碼,出于安全考慮,送出前需要對密碼進行額外處理,如圖所示:

從源碼來看,是在原始密碼後添加了一個“Verydows”字元串,然後對這個新的字元串進行MD5哈希運算,得出的摘要字元串資料作為傳輸的密碼内容使用。過程相當于:
原始密碼 = 123456
字元串A = 原始密碼 + “Verydows” = "123456Verydows"
新密碼 = md5(字元串A) = md5("123456Verydows") = 200c6d94e583e62c6964de3acdc723e5
在編寫測試用例的時候,把登入表單資料通過請求發給伺服器,肯定不能直接寫成原始密碼方式,但如果把處理後的密碼作為測試資料,這顯然又不友好。
不友好用例: 密碼使用處理後内容,不易讀,且構造測試資料存在困難。
request:
url: http://.......
method: POST
data:
username: admin
password: 200c6d94e583e62c6964de3acdc723e5
友好的用例格式:密碼使用原始密碼
request:
url: http://.......
method: POST
data:
username: admin
password: 123456
問題的解決,這裡提供兩種方式:
- 方式一:單獨定義一個密碼處理函數,在密碼指派時直接調用;
- 方式二:通過鈎子函數,送出前對請求資料進行二次加工和處理。
方式一:單獨定義一個密碼處理函數
在 debugtalk.py 檔案中定義函數 get_md5_str(),将傳入的密碼進行 MD5 處理,執行後輸出結果和我們抓包看到的處理後密碼完全相同。
import hashlib
def get_md5_str(pwd):
str_pwd = "%sVerydows" % pwd
str_pwd_to_b = bytes(str_pwd, encoding='utf-8')
str_md5 = hashlib.md5(str_pwd_to_b).hexdigest()
return str_md5
if __name__ == "__main__":
print(get_md5_str("123456"))
執行輸出:
200c6d94e583e62c6964de3acdc723e5
編寫測試用例:
- config:
name: 測試用例
- test:
name: 測試步驟 - 打開登入頁面
variables:
# 将原始密碼提取為一個變量
p_pwd: 123456
request:
url: http://192.168.1.102/verydows/index.php?m=backend&c=main&a=login
method: POST
data:
username: admin
# 調用密碼處理函數,将原始密碼進行加工
password: ${get_md5_str($p_pwd)}
validata:
- eq: [status_code, 200]
- eq: [<iframe name="(.*)" id="main", main]
方式二:通過鈎子函數對請求進行預處理
在 debugtalk.py 檔案中定義兩個函數:
- 函數1:get_md5_str():将原始密碼進行摘要處理
- 函數2:set_req():将請求中的密碼資料替換為前面處理好的摘要數值
import requests
import hashlib
# 将原始密碼進行摘要處理
def get_md5_str(pwd):
str_pwd = "%sVerydows" % pwd
str_pwd_to_b = bytes(str_pwd, encoding='utf-8')
str_md5 = hashlib.md5(str_pwd_to_b).hexdigest()
return str_md5
# 将請求内容進行預處理
def set_req(req, pwd):
# 将原始密碼進行摘要處理
new_pwd = get_md5_str(pwd)
# 将請求中的原始密碼替換為摘要密碼
req[data][password] = new_pwd
編寫測試用例:
注意:
- 在調用自定義函數時,需要傳入 $request 參數,這是對目前測試步驟請求的封裝的引用。有了這個參數,函數内就可以實作對請求的加工和處理了,相當于在向伺服器發送前,改變了原來請求的内容。
- 同理,如果在 teardown_hooks 鈎子中傳入 $response 參數,則可以對伺服器的響應内容預先進行處理和調整。
- config:
name: 測試用例
- test:
name: 測試步驟 - 打開登入頁面
variables:
p_pwd: 123456
request:
url: http://192.168.1.102/verydows/index.php?m=backend&c=main&a=login
method: POST
data:
username: admin
password: $p_pwd
validata:
- eq: [status_code, 200]
- eq: [<iframe name="(.*)" id="main", main]
setup_hooks:
# 對請求頭中的密碼資料進行預處理
- ${set_req($request, $p_pwd)}
執行用例成功