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

Pytest - Run the same test in slow mode and fast mode

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

如您所见,测试之间的唯一差异是循环迭代次数。我很乐意配置测试,如果他 运行 处于“快速模式”,他会进行一些迭代,如果他 运行 处于“慢速模式”,他会做很多。不会有代码重复。

我该怎么做?


I 运行 使用 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)

And/or可以通过配置控制重复次数...