如何在测试类setup_class相关方法中访问conftest的fixture?
pytest fixture在测试类setup/teardown中调用的解决方案
方法1:用类级别autouse fixture传递对象
这是最贴合现有代码结构的方案:定义一个类级别的自动执行fixture,先拿到conftest里的fixture对象,赋值给测试类的属性,这样setup_class和teardown_class就能直接使用。
import pytest class TestClass(): @classmethod def setup_class(cls): cls.setup_apps(cls.fixture_obj) cls.stub_apps(cls.fixture_obj) @classmethod def teardown_class(cls): cls.unstub_apps(cls.fixture_obj) @pytest.fixture(scope="class", autouse=True) def init_fixture(cls, your_conftest_fixture): # 把conftest的fixture对象绑定到类属性 cls.fixture_obj = your_conftest_fixture
方法2:把初始化/清理逻辑移到fixture里(推荐)
pytest的fixture本身就是用来管理测试生命周期的,直接把setup_apps、stub_apps这些逻辑放进fixture,替代setup_class和teardown_class更符合pytest的设计思路:
import pytest @pytest.fixture(scope="class") def app_env(your_conftest_fixture): # 执行初始化操作 your_conftest_fixture.setup_apps() your_conftest_fixture.stub_apps() yield your_conftest_fixture # 把对象传给测试方法 # 测试完成后执行清理 your_conftest_fixture.unstub_apps() class TestClass(): def test_example(self, app_env): # 测试里直接用app_env这个初始化好的对象 pass
方法3:用pytest_configure钩子(不推荐)
如果一定要保留setup_class的结构,可以通过配置钩子提前获取fixture对象,但这种方式比较hack,容易因作用域、初始化顺序出现问题,仅适合特殊场景:
import pytest def pytest_configure(config): # 从conftest导入fixture并初始化,注意作用域匹配 from conftest import your_conftest_fixture TestClass.fixture_obj = your_conftest_fixture(config) class TestClass(): fixture_obj = None @classmethod def setup_class(cls): cls.setup_apps(cls.fixture_obj) cls.stub_apps(cls.fixture_obj) @classmethod def teardown_class(cls): cls.unstub_apps(cls.fixture_obj)
内容的提问来源于stack exchange,提问作者suryadevi
相关产品推荐
相关产品推荐

