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

  • 2019 年 10 月 8 日
  • 筆記

前言

前面幾篇零散的學了一些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 實例