如何在pytest测试类中为全局与特定方法配置参数化?
问题与解决方案
问题场景
想要给测试类添加@pytest.mark.parametrize装饰器,让类内所有测试方法都能获取通用参数;同时给类中特定方法单独添加该装饰器,使其拥有额外测试用例。但运行代码时出现ValueError: duplicate parametrization of 'pytest_parameters'错误。
测试代码
import pytest @pytest.mark.parametrize("pytest_parameters",[ pytest.param( [ {'key1' : '3' , 'key2' : '5'}] , id="apple") ]) class TestClass: def test_one(self,pytest_parameters): print(pytest_parameters) @pytest.mark.parametrize("pytest_parameters",[ pytest.param( [ {'key1' : '5' , 'key2' : '10'}] , id="pear") ]) def test_two(self, pytest_parameters): print(pytest_parameters)
错误信息
E ValueError: duplicate parametrization of 'pytest_parameters' =========================== short test summary info ============================ ERROR test_x.py::TestClass - ValueError: duplicate parametrization ...
错误原因
pytest不允许同一个参数名被重复使用@pytest.mark.parametrize装饰——无论是类级别还是方法级别,同名参数会被判定为重复定义,触发该错误。
解决方案
方案1:用不同参数名区分通用与专属参数
给类级别和方法级别的参数设置不同名称,让方法同时接收通用参数与专属额外参数:
import pytest @pytest.mark.parametrize("common_params",[ pytest.param( [ {'key1' : '3' , 'key2' : '5'}] , id="apple") ]) class TestClass: def test_one(self, common_params): print("通用参数:", common_params) @pytest.mark.parametrize("extra_params",[ pytest.param( [ {'key1' : '5' , 'key2' : '10'}] , id="pear") ]) def test_two(self, common_params, extra_params): print("通用参数:", common_params) print("专属额外参数:", extra_params)
此方案下,test_two会同时接收类级别的通用参数和方法级别的专属参数,若双方有多组参数,会自动生成笛卡尔积组合的测试用例。
方案2:扩展方法的测试用例集合
如果希望特定方法既执行通用用例,又执行自己的额外用例,可以直接合并通用用例与方法专属用例,复用同一个参数名:
import pytest # 抽离通用测试用例 COMMON_CASES = [pytest.param([{'key1': '3', 'key2': '5'}], id="apple")] # 定义test_two的额外用例 TEST_TWO_EXTRA_CASES = [pytest.param([{'key1': '5', 'key2': '10'}], id="pear")] @pytest.mark.parametrize("pytest_parameters", COMMON_CASES) class TestClass: def test_one(self, pytest_parameters): print(pytest_parameters) @pytest.mark.parametrize("pytest_parameters", COMMON_CASES + TEST_TWO_EXTRA_CASES) def test_two(self, pytest_parameters): print(pytest_parameters)
此方案下,test_one仅执行通用用例,test_two会执行通用用例+额外用例的全部集合。
内容的提问来源于stack exchange,提问作者stackQA
相关产品推荐
相关产品推荐

