httprunner學習9-完整的用例結構(yaml&json)


前言

前面幾篇零散的學了一些httprunner的知識點,那么一個完整的 YAML/JSON 用例文件包含哪些關鍵字呢?

測試用例結構

在 HttpRunner 中,測試用例組織主要基於三個概念:

  • 測試用例集(testsuite):對應一個文件夾,包含單個或多個測試用例(YAML/JSON)文件
  • 測試用例(testcase):對應一個 YAML/JSON 文件,包含單個或多個測試步驟
  • 測試步驟(teststep):對應 YAML/JSON 文件中的一個 test,描述單次接口測試的全部內容,包括發起接口請求、解析響應結果、校驗結果等

對於單個 YAML/JSON 文件來說,數據存儲結構為 list of dict 的形式,其中可能包含一個全局配置項(config)和若干個測試步驟(test)。

  • config:作為整個測試用例的全局配置項
  • test:對應單個測試步驟(teststep),測試用例存在順序關系,運行時將從前往后依次運行各個測試步驟

對應的 JSON 格式如下所示:

[
  {
    "config": {...}
  },
  {
    "test": {...}
  },
  {
    "test": {...}
  }
]

對應的 YAML 格式如下所示

- config:
    name: xxx

- test:
    name: login case1
    request:
        url: http://127.0.0.1:8000/api/v1/login/
    ...
    
- test:
    name: login case2
    request:
        url: http://127.0.0.1:8000/api/v1/login/
    ...

變量空間(context)作用域

在測試用例內部,HttpRunner 划分了兩層變量空間作用域(context)。

  • config:作為整個測試用例的全局配置項,作用域為整個測試用例;
  • test:測試步驟的變量空間(context)會繼承或覆蓋 config 中定義的內容;
    • 若某變量在 config 中定義了,在某 test 中沒有定義,則該 test 會繼承該變量
    • 若某變量在 config 和某 test 中都定義了,則該 test 中使用自己定義的變量值
  • 各個測試步驟(test)的變量空間相互獨立,互不影響;
  • 如需在多個測試步驟(test)中傳遞參數值,則需要使用 extract 關鍵字,並且只能從前往后傳遞

config配置

關鍵字 是否必須 格式類型 描述
name Yes string 測試用例的名稱,在測試報告中將作為標題
variables No list of dict 定義的全局變量,作用域為整個用例
parameters No list of dict 全局參數,用於實現數據化驅動,作用域為整個用例
request No dict request 的公共參數,作用域為整個用例;常用參數包括 base_url 和 headers

request相關參數

關鍵字 是否必須 格式類型 描述
base_url No string 測試用例請求 URL 的公共 host,指定該參數后,test 中的 url 可以只描述 path 部分
headers No dict request 中 headers 的公共參數,作用域為整個用例
output No list 整個用例輸出的參數列表,可輸出的參數包括公共的 variable 和 extract 的參數; 在 log-level 為 debug 模式下,會在 terminal 中打印出參數內容

config配置 JSON 格式示例

"config": {
    "name": "testcase description",
    "parameters": [
        {"user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"]},
        {"app_version": "${P(app_version.csv)}"},
        {"os_platform": "${get_os_platform()}"}
    ],
    "variables": [
        {"user_agent": "iOS/10.3"},
        {"device_sn": "${gen_random_string(15)}"},
        {"os_platform": "ios"}
    ],
    "request": {
        "base_url": "http://127.0.0.1:5000",
        "headers": {
            "Content-Type": "application/json",
            "device_sn": "$device_sn"
        }
    },
    "output": [
        "token"
    ]
}

config配置 YAML 格式示例

- config:
    name: xxx
    parameters:
        - user_agent: ["iOS/10.1", "iOS/10.2", "iOS/10.3"]
        - app_version: ${P(app_version.csv)}
        - os_platform: ${get_os_platform()}
    variables:
        - user_agent: iOS/10.3
        - device_sn: ${gen_random_string(15)}
        - os_platform: ios
    request:
        base_url: http://127.0.0.1:5000
        headers:
            Content-Type: application/json
            device_sn: $device_sn
    output:
        - token

test相關參數

關鍵字 是否必須 格式類型 描述
namel Yes string 測試步驟的名稱,在測試報告中將作為測試步驟的名稱
request Yes dict HTTP 請求的詳細內容;可用參數詳見 python-requests 官方文檔
variables No list of dict 測試步驟中定義的變量,作用域為當前測試步驟
extract No list 從當前 HTTP 請求的響應結果中提取參數,並保存到參數變量中(例如token),后續測試用例可通過$token的形式進行引用
validate No list 測試用例中定義的結果校驗項,作用域為當前測試用例,用於實現對當前測試用例運行結果的校驗
setup_hooks No list 在 HTTP 請求發送前執行 hook 函數,主要用於准備工作
teardown_hooks No list 在 HTTP 請求發送后執行 hook 函數,主要用戶測試后的清理工作

test用例 JSON 格式示例

"test": {
    "name": "get token with $user_agent, $os_platform, $app_version",
    "request": {
        "url": "/api/get-token",
        "method": "POST",
        "headers": {
            "app_version": "$app_version",
            "os_platform": "$os_platform",
            "user_agent": "$user_agent"
        },
        "json": {
            "sign": "${get_sign($user_agent, $device_sn, $os_platform, $app_version)}"
        },
        "extract": [
            {"token": "content.token"}
        ],
        "validate": [
            {"eq": ["status_code", 200]},
            {"eq": ["headers.Content-Type", "application/json"]},
            {"eq": ["content.success", true]}
        ],
        "setup_hooks": [],
        "teardown_hooks": []
    }
}

test用例 YAML 格式示例

- test:
    name: get token with $user_agent, $os_platform, $app_version
    request:
        url: /api/get-token
        method: POST
        headers:
            app_version: $app_version
            os_platform: $os_platform
            user_agent: $user_agent
        json:
            sign: ${get_sign($user_agent, $device_sn, $os_platform, $app_version)}
        extract:
            - token: content.token
        validate:
            - eq: [status_code, 200]
            - eq: [headers.Content-Type, application/json]
            - eq: [content.success, true]
        setup_hooks: []
        teardown_hooks: []

hooks

setup_hooks 函數放置於 debugtalk.py 中,並且必須包含三個參數:

  • method: 請求方法,e.g. GET, POST, PUT
  • url: 請求 URL
  • kwargs: request 的參數字典

teardown_hooks 函數放置於 debugtalk.py 中,並且必須包含一個參數:

  • resp_obj: requests.Response 實例


免責聲明!

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



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