天天看點

L03_HttpRunner的hook(鈎子)機制:(setup/teardown)對請求和響應内容進行預處理

L03_HttpRunner的hook(鈎子)機制:(setup/teardown)對請求和響應内容進行預處理

有些系統登入頁面輸入使用者名和密碼,出于安全考慮,送出前需要對密碼進行額外處理,如圖所示:

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)}
   
           

執行用例成功

L03_HttpRunner的hook(鈎子)機制:(setup/teardown)對請求和響應内容進行預處理

繼續閱讀