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可以通过配置控制重复次数...
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可以通过配置控制重复次数...