如何为类内所有测试函数统一配置pytest参数化?
问题描述
我搭建了如下示例单元测试,存在多个带有自有fixture的测试类,以下展示第5个类:
import pytest class TestOperator1: .... class TestOperator5: @pytest.fixture(scope="class") def runm0(self, request): yield request.param+10 @pytest.fixture(scope="class") def runm1(self, request): yield request.param+20 @pytest.mark.parametrize("runm0, runm1", [(5, 10), (20, 30)]) def test_1(self, runm0, runm1): assert runm0*runm1 == 10 @pytest.mark.parametrize("runm0, runm1", [(5, 10), (20, 30)]) def test_2(self, runm0, runm1): assert runm0*runm1 == 20 @pytest.mark.parametrize("runm0, runm1", [(5, 10), (20, 30)]) def test_3(self, runm0, runm1): assert runm0*runm1 == 30
想仅编写一次parametrize代码,使其作用于类内所有测试函数。给类加parametrize装饰器看起来是可行方案,但待参数化的fixture定义在类内部时该怎么操作?
解决方案
直接给测试类添加@pytest.mark.parametrize装饰器即可,类内部定义的fixture完全支持这种用法,不需要额外处理。
修改后的代码如下:
import pytest class TestOperator1: .... @pytest.mark.parametrize("runm0, runm1", [(5, 10), (20, 30)]) class TestOperator5: @pytest.fixture(scope="class") def runm0(self, request): yield request.param + 10 @pytest.fixture(scope="class") def runm1(self, request): yield request.param + 20 def test_1(self, runm0, runm1): assert runm0 * runm1 == 10 def test_2(self, runm0, runm1): assert runm0 * runm1 == 20 def test_3(self, runm0, runm1): assert runm0 * runm1 == 30
关键说明
- 类级别的
parametrize会自动把参数传递给类内所有测试方法,同时能正确关联类内部定义的fixture——pytest会优先查找类内的fixture,再去全局范围查找。 - 这里fixture的
scope="class"可以保留,需要注意:当使用类级别的parametrize时,每个参数组合都会创建一个独立的类实例,fixture会在每个类实例的生命周期内生效一次。
内容的提问来源于stack exchange,提问作者Fanylion
相关产品推荐
相关产品推荐

