Pytest -在慢速模式和快速模式下运行相同的测试



PyTest是我用来测试程序的。一个测试使用随机生成器,这使得测试具有统计性。

为了达到特定的重要程度,测试必须通过大量的循环运行,这需要很长时间。大多数时候,我对最少的迭代次数和获得的结果感到满意。问题是,我如何能够基于测试的上下文运行具有多个迭代的相同测试?

下面是一个小代码的例子,它将帮助我说明我的观点:

import pytest
import random
import statistics
def test_fast():
delta_list = []
for i in range(10):
# The random process I employ is, of course, different,
# and each iteration takes approximately a half-second.
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.mark.slow
def test_fast():
delta_list = []
for i in range(100000):
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

正如您所看到的,测试之间的唯一变化是循环迭代的次数。我很乐意配置测试,这样,如果他在"快速模式"下运行,他会做一些迭代,如果他在"慢速模式"下运行,他会做很多迭代。没有代码重复。

我该怎么做呢?


我使用py.test命令运行快速测试,使用py.test --runslow命令运行慢速测试。这可以通过设置以下配置来完成:

import pytest

def pytest_addoption(parser):
parser.addoption(
"--runslow", action="store_true", default=False, help="run slow tests"
)

def pytest_configure(config):
config.addinivalue_line("markers", "slow: mark test as slow to run")

def pytest_collection_modifyitems(config, items):
if config.getoption("--runslow"):
# --runslow given in cli: do not skip slow tests
return
skip_slow = pytest.mark.skip(reason="need --runslow option to run")
for item in items:
if "slow" in item.keywords:
item.add_marker(skip_slow)

看起来您可以将非平凡代码分解为实用函数(其名称不是test_开头),并从那里开始:

def test_fast():
run_repeatedly(10)
@pytest.mark.slow
def test_fast():
run_repeatedly(100000)

和/或您可以通过配置控制重复的次数…

最新更新