前言
對於使用過 Python結合Unittest 框架來做自動化測試的同學,應該知道在 Unittest 中,有這樣2個方法:setUp()
和 tearDown()
,即前置和后置操作。通常 setUp() 主要用於測試准備工作,而 tearDown() 主要用於 測試后的數據清理。
在 HttpRunner 中,我們可以通過 hook機制 來實現 setUp()
和 tearDown()
。
本人環境:HttpRunner V1.5.8
測試場景
我們將用一個登錄的接口來進行說明,完整的 YAML
格式用例如下:
- config:
name: login test
request:
base_url: http://api.nnzhp.cn
- test:
name: login case 1
request:
url: /api/user/login
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
data:
username: test1010
passwd: aA123456
validate:
- eq: [status_code, 200]
- eq: [content.error_code, 0]
- test:
name: login case 2
request:
url: /api/user/login
method: POST
headers:
Content-Type: application/x-www-form-urlencoded
User-Agent: Fiddler
data:
username: test1010
passwd: aA123456
validate:
- eq: [status_code, 200]
- eq: [content.error_code, 0]
對於 hook 函數的定義,我們一般在 debugtalk.py
中進行編寫,然后在測試用例中直接調用 hook 函數,比如我在 debugtalk.py 做如下准備:
def hook_setup():
print("開始--------hook_setup")
def hook_teardown():
print("結束--------hook_teardown")
在 config 中使用hook
如果在 HttpRunner 中使用hook機制,那么將用到關鍵字 setup_hooks 和 teardown_hooks,且只會在當前 YAML/JSON 用例中執行一次。
- setup_hooks: 在整個用例開始執行前觸發 hook 函數,主要用於准備工作。
- teardown_hooks: 在整個用例結束執行后觸發 hook 函數,主要用於測試后的清理工作。
在 config 中引入 hook,修改如下:
- config:
name: login test
request:
base_url: http://api.nnzhp.cn
setup_hooks:
- ${hook_setup()}
teardown_hooks:
- ${hook_teardown()}
接着,運行用例,得到如下結果:
從上面的用例執行情況,我們可以看到,一共執行了 2 個用例,debugtalk.py 中的 hook_setup()
和 hook_teardown()
都只執行了1次,這是因為在 config 中,hook機制的作用域是整個YAML用例
。
在 test 中使用hook
在 test 中,我們也可以使用關鍵字 setup_hooks 和 teardown_hooks,在這里,它的作用域是針對當前 test,如果我們有多個 test,那么就會執行多次。
- setup_hooks: 在 HTTP 請求發送前執行 hook 函數,主要用於准備工作;也可以實現對請求的 request 內容進行預處理。
- teardown_hooks: 在 HTTP 請求發送后執行 hook 函數,主要用於測試后的清理工作;也可以實現對響應的 response 進行修改,例如進行加解密等處理。
我們可以在 debugtalk.py 中的函數增加傳入參數的功能,簡單修改如下:
def hook_setup(request=""):
print("開始--------hook_setup")
print("request請求:{}".format(request))
def hook_teardown(response=""):
print("結束--------hook_teardown")
print("response響應:{}".format(response))
我們可以在這里將 請求的request
和 響應的response
打印處理,然后分別在 2 個 test 中引入 hook,如下:
- config:
name: login test
request:
base_url: http://api.nnzhp.cn
- test:
name: login case 1
省略部分內容
setup_hooks:
- ${hook_setup($request)}
teardown_hooks:
- ${hook_teardown($response)}
省略部分內容
- test:
name: login case 2
省略部分內容
setup_hooks:
- ${hook_setup($request)}
teardown_hooks:
- ${hook_teardown($response)}
省略部分內容
這個時候,我們再去運行用例,得到如下結果:
對比之前的結果,可以發現,test
中的 setup_hooks 和 teardown_hooks 是針對單個 test
。
需要注意的地方
在使用 hook機制 的時候,我們需要注意一點,在上面的 test 中,我們使用了 teardown_hooks ,這里是在返回最終結果之前執行的,我們不能將從響應結果中提取到的數據,作為參數傳入 hook_teardown 函數中。
我們需要簡單修改一下 YAML 用例,將 第二個test
做如下修改:
- test:
name: login case 2
省略部分內容
extract:
- sign: content.login_info.sign
setup_hooks:
- ${hook_setup($request)}
teardown_hooks:
- ${hook_teardown($sign)}
省略部分內容
我們通過 extract
提取返回結果中的 sign ,並把它傳入 hook_teardown() ,然后再去執行用例。
上面的結果,告訴我們找不到 sign 參數,這是因為 teardown_hooks
是在 最終數據返回前 的處理,而 extract
提取操作是在 返回數據之后 的處理。