如何在Pytest中实现同一测试用例快慢双模式无冗余代码运行
解决方案
你原有pytest配置不需要做任何改动,只需要修改测试代码,动态根据命令行参数动态调整迭代次数即可,有两种常见实现方式:
方式一:直接判断运行开关(最简洁)
通过pytest的request fixture可以直接读取命令行参数值,在单个测试里判断循环次数,完全消除重复代码:
import pytest import random import statistics def test_random_statistics(request): # 按运行模式设置迭代次数 if request.config.getoption("--runslow"): iterations = 100000 else: iterations = 10 delta_list = [] for i in range(iterations): # 保留你原有的随机过程逻辑 number = random.uniform(0, 1) expected_avg = 0.5 delta = number - expected_avg delta_list.append(delta) avg_delta = sum(delta_list) / len(delta_list) std_delta = statistics.stdev(delta_list) assert avg_delta < 0.1 assert std_delta < 0.15
直接运行pytest就会执行10次迭代的快速测试,运行pytest --runslow就会自动执行10万次迭代的慢速测试。
方式二:参数化标记(适合需要单独筛选测试的场景)
如果你需要单独筛选运行快/慢用例,可以用参数化给不同迭代次数的用例加对应标记,原有配置逻辑也无需改动:
import pytest import random import statistics @pytest.mark.parametrize("iterations", [ pytest.param(10, id="fast"), pytest.param(100000, marks=pytest.mark.slow, id="slow") ]) def test_random_statistics(iterations): delta_list = [] for i in range(iterations): number = random.uniform(0, 1) expected_avg = 0.5 delta = number - expected_avg delta_list.append(delta) avg_delta = sum(delta_list) / len(delta_list) std_delta = statistics.stdev(delta_list) assert avg_delta < 0.1 assert std_delta < 0.15
这种方式下运行pytest只会执行10次迭代的快速用例,运行pytest --runslow会同时执行快、慢两个用例,如需单独跑慢用例加-m slow参数即可。
内容的提问来源于stack exchange,提问作者Yanirmr
相关产品推荐
相关产品推荐

