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 ),否则追究法律责任,谢谢!