httprunner3.x中的參數化我們需要引入pytest和處理參數化的函數:
import pytest from httprunner import Parameters
源碼介紹 Parameters 中的使用方法:
def parse_parameters(parameters: Dict,) -> List[Dict]: """ parse parameters and generate cartesian product. Args: parameters (Dict) parameters: parameter name and value mapping parameter value may be in three types: (1) data list, e.g. ["iOS/10.1", "iOS/10.2", "iOS/10.3"] (2) call built-in parameterize function, "${parameterize(account.csv)}" (3) call custom function in debugtalk.py, "${gen_app_version()}" Returns: list: cartesian product list Examples: >>> parameters = { "user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"], "username-password": "${parameterize(account.csv)}", "app_version": "${gen_app_version()}", } >>> parse_parameters(parameters) """ parsed_parameters_list: List[List[Dict]] = []
第一種是直接獲取數據列表的信息:
- number就是我們引用的變量
import pytest from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters, RunTestCase)
@pytest.mark.parametrize('param', Parameters({'number': [1, 2], 'token_length': [32]})) def test_start(self, param): super().test_start(param) config = ( Config("login") .variables( **{"username": "${ENV(USERNAME)}", "password": "${ENV(PASSWORD)}" } ) .base_url("${ENV(HOSTURL)}") .verify(False) # .export(*["param"]) ) teststeps = [ Step( RunRequest('login') .with_variables(**{'status_code': 201, 'status': 1}) .post('/client/user/auth') .with_headers(**{"Content-Type": "application/json"}) .with_json({"scenario": "client", "company_id": 5940, "user_name": "$username", "password": "$password", "device_type": "$number", "device": ""}) .extract() .with_jmespath("body.data.token", "token") .validate() .assert_equal('status_code', '$status_code', '斷言失敗') .assert_equal('body.status', '$status', '斷言失敗') .assert_length_equal('body.data.token', '$token_length', '斷言失敗') ) ]
第二種調用內置parameterize函數讀取.csv中的測試數據:
- username和password就是我們要引用的變量,${parameterize(parameter.csv)} 就是我們讀取的.csv文件的數據源
username-password 是組合數據,每次遍歷出來是一組數值,分別賦值給對應變量。
import pytest from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters, RunTestCase) class TestCaseLogin(HttpRunner): @pytest.mark.parametrize('param', Parameters({"username-password": "${parameterize(parameter.csv)}"})) def test_start(self, param): print(param) super().test_start(param) config = ( Config("login") .base_url("${ENV(HOSTURL)}") .verify(False) # .export(*["param"]) ) teststeps = [ Step( RunRequest('login') .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1}) .post('/client/user/auth') .with_headers(**{"Content-Type": "application/json"}) .with_json({"scenario": "client", "company_id": 5940, "user_name": "$username", "password": "$password", "device_type": "$number", "device": ""}) .extract() .with_jmespath("body.data.token", "token") .validate() .assert_equal('status_code', '$status_code', '斷言失敗') .assert_equal('body.status', '$status', '斷言失敗') .assert_length_equal('body.data.token', '$token_length', '斷言失敗') ) ]
第三種是在debugtalk中調用自定義函數:
- device_type就是我們要引用的參數化變量,${get_data()} 就是我們自定義的函數
import pytest from httprunner import (HttpRunner, Config, Step, RunRequest, Parameters, RunTestCase) class TestCaseLogin(HttpRunner): @pytest.mark.parametrize('param', Parameters({"device_type": "${get_data()}"})) def test_start(self, param): print(param) super().test_start(param) config = ( Config("login") .base_url("${ENV(HOSTURL)}") .variables( **{"username": "${ENV(USERNAME)}", "password": "${ENV(PASSWORD)}" } ) .verify(False) # .export(*["param"]) ) teststeps = [ Step( RunRequest('login') .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1}) .post('/client/user/auth') .with_headers(**{"Content-Type": "application/json"}) .with_json({"scenario": "client", "company_id": 5940, "user_name": "$username", "password": "$password", "device_type": "$device_type", "device": ""}) .extract() .with_jmespath("body.data.token", "token") .validate() .assert_equal('status_code', '$status_code', '斷言失敗') .assert_equal('body.status', '$status', '斷言失敗') .assert_length_equal('body.data.token', '$token_length', '斷言失敗') ) ]
注意點:參數化的時候引用文件數據源和自定義函數是用 “ ${ 數據源 } ”,測試用例間引用變量直接 “ $變量名 ”,不需要大括號
從上面的栗子來看,您會發現,實際的數據驅動,還是使用的pytest中的 parametrize , 其實就是 httprunner 在 pytest的parametrize上封裝了一層,增加了csv和debugtalk.py參數化的應用 。
以上總結或許能幫助到你,或許幫助不到你,但還是希望能幫助到你,如有疑問、歧義,評論區留言會及時修正發布,謝謝!
未完,待續…
一直都在努力,希望您也是!
轉載請附帶原文鏈接 ( https://www.cnblogs.com/lifeng0402/articles/14578883.html ),否則追究法律責任,謝謝!