如何在跳过Pytest测试类时避免执行其参数化逻辑?
解决方案
核心问题原因
get_nums()会在pytest加载测试模块阶段就执行,而非测试运行阶段,所以哪怕你只跑TestQuick,也得等它执行完才能开始测试。
方案1:用pytest_generate_tests动态生成参数
这个方法能让参数生成逻辑仅在需要运行TestSlow相关测试时才执行,同时保留原有的测试分组结构,还能正常使用多进程加速nums生成。
修改后的代码:
import pytest from multiprocessing import Pool class TestQuick: def test_quick(self): pass class TestSlow: def test_1(self, num): pass def test_2(self, num): pass def get_nums(): inputs = range(100) with Pool(10) as pool: return list(pool.map(IO_fn, inputs)) # IO_fn是你的慢IO函数 def pytest_generate_tests(metafunc): # 只针对TestSlow类中的测试函数,且参数名为num的情况生成参数 if metafunc.cls is TestSlow and "num" in metafunc.fixturenames: nums = get_nums() metafunc.parametrize("num", nums)
效果说明
- 当你运行
pytest test.py -k "Quick"时,pytest_generate_tests里的get_nums()不会执行,直接跑快速测试,无需等待慢IO操作。 - 测试输出会保持
TestSlow/test_1[0]、TestSlow/test_2[0]这种分组结构,和原参数化的输出一致。 get_nums()里的多进程逻辑可以正常使用,不影响效率。
为什么之前的尝试没生效?
indirect=True是用来把参数值当作fixture名称解析,但你还是直接传了get_nums(),模块加载时依然会执行它。- 把
IO_fn改成class级fixture,虽然延迟了执行,但fixture的参数化方式无法生成带参数标识的测试分组,且fixture本身不适合做批量多进程的参数生成。
内容的提问来源于stack exchange,提问作者dbrackbill
相关产品推荐
相关产品推荐

