如何在pytest脚本中仅运行setup/cleanup 跳过全部测试用例
核心解决思路
pytest的setup/cleanup(fixture)逻辑必须依赖至少一个可执行的测试用例被收集到才会触发,原有方案过滤掉所有用例后pytest会直接忽略当前脚本,因此需要同时满足两个条件:1、保留至少一个简单的兜底用例,保证fixture触发;2、实现批量跳过业务测试用例的逻辑,不需要手动罗列用例名。
方案1:自定义标记+全局跳过(推荐,可维护性最高)
代码实现(修改test1.py)
import pytest import os # 注册自定义标记,避免pytest告警 def pytest_configure(config): config.addinivalue_line( "markers", "business_test: 标记业务测试用例,可通过环境变量批量跳过" ) # 全局控制跳过业务测试的钩子 def pytest_collection_modifyitems(config, items): if os.getenv("SKIP_BUSINESS_TEST") != "1": return skip_mark = pytest.mark.skip(reason="配置为仅执行setup/cleanup,跳过业务测试") for item in items: if "business_test" in item.keywords: item.add_marker(skip_mark) # 你的setup/cleanup逻辑,示例为会话级别自动执行的fixture @pytest.fixture(scope="session", autouse=True) def global_setup_cleanup(): # setup部分 print("执行全局setup逻辑") yield # cleanup部分,兼容原有的SKIP_CLEANUP_ON_SOMETHING逻辑 if os.getenv("SKIP_CLEANUP_ON_SOMETHING") != "1": print("执行全局cleanup逻辑") # 兜底测试用例,保证至少有一个用例被执行,触发fixture def test_dummy_trigger_fixture(): # 无实际业务逻辑,仅做占位 assert True # 所有业务测试用例统一打business_test标记 @pytest.mark.business_test def test_abc(): assert 1 == 1 @pytest.mark.business_test def test_def(): assert 2 == 2 # 后续新增业务测试只需加@pytest.mark.business_test即可,无需修改执行命令
执行命令
# 场景1:仅执行setup/cleanup,跳过所有业务测试 SKIP_BUSINESS_TEST=1 pytest test1.py # 场景2:正常执行所有测试用例+setup/cleanup pytest test1.py # 场景3:执行指定测试用例+setup/cleanup pytest test1.py -k "test_abc"
方案2:测试用例分组+--deselect参数(无需改代码,适合临时使用)
如果不想修改现有测试代码,可将所有业务测试用例放到同一个测试类下,执行时直接排除整个类即可,无需罗列单个用例:
代码示例
# test1.py import pytest @pytest.fixture(scope="module", autouse=True) def module_setup_cleanup(): print("执行setup") yield print("执行cleanup") # 所有业务测试都放在这个类里 class TestBusinessCases: def test_abc(self): pass def test_def(self): pass # 新增用例都写在这个类内部 # 兜底用例 def test_dummy(): assert True
执行命令
# 仅执行setup/cleanup,跳过所有业务测试 pytest test1.py --deselect test1.py::TestBusinessCases
内容的提问来源于stack exchange,提问作者Qiang Xu
相关产品推荐
相关产品推荐

