HttpRunner學習10--hook機制


前言

對於使用過 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_hooksteardown_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()}

接着,運行用例,得到如下結果:

在config中使用hook

從上面的用例執行情況,我們可以看到,一共執行了 2 個用例,debugtalk.py 中的 hook_setup()hook_teardown() 都只執行了1次,這是因為在 config 中,hook機制的作用域是整個YAML用例

在 test 中使用hook

在 test 中,我們也可以使用關鍵字 setup_hooksteardown_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中使用hook

對比之前的結果,可以發現,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 提取操作是在 返回數據之后 的處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM