Pytest 根据 mark.parameterize 值选择测试?

Jun*_*ter 6 python pytest

我从这里看到,我可以根据他们的标记挑选测试,如下所示:

pytest -v -m webtest
Run Code Online (Sandbox Code Playgroud)

假设我有一个像这样装饰的测试:

@pytest.mark.parametrize('platform,configuration', (
    pytest.param('win', 'release')
    pytest.param('win', 'debug')))
def test_Foo(self):
Run Code Online (Sandbox Code Playgroud)

我想做如下事情:

pytest -v -m parameterize.configuration.release
Run Code Online (Sandbox Code Playgroud)

这样我用'release'的参数而不是'debug'的参数运行test_Foo。有没有办法做到这一点?我想我可以通过编写一个包装测试然后只传递所需的参数来做到这一点,但我想避免这样做,因为我们已经有大量的测试参数化为描述,我想避免编写大量的包装测试。

hoe*_*ing 10

您可以用于-k基于表达式的过滤:

$ pytest -k win-release
Run Code Online (Sandbox Code Playgroud)

将仅运行win-release名称中包含的测试。您可以通过发出以下命令列出所有名称而不执行测试

$ pytest --collect-only -q
Run Code Online (Sandbox Code Playgroud)

如果表达式还不够,您始终可以pytest通过添加自定义过滤逻辑来扩展,例如通过命令行参数传递参数名称和值并仅选择相应参数化的测试:

# conftest.py

def pytest_addoption(parser):
    parser.addoption('--param-name', action='store',  help='parameter name')
    parser.addoption('--param-value', action='store',  help='parameter value')


def pytest_collection_modifyitems(session, config, items):
    param_name = config.getoption('--param-name')
    param_value = config.getoption('--param-value')
    if param_name and param_value:
        items[:] = [item for item in items
                    if hasattr(item, 'callspec')
                    and param_name in item.callspec.params
                    and item.callspec.params[param_name] == param_value]
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话

$ pytest --param-name=platform --param-value=win
Run Code Online (Sandbox Code Playgroud)

并且仅platform=win执行参数化的测试。