Pytest选择基于mark.parameterize值的测试吗?

时间:2018-10-12 19:34:35

标签: python pytest

我从here看到,我可以根据它们的标记来挑选测试,如下所示:

pytest -v -m webtest

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

@pytest.mark.parametrize('platform,configuration', (
    pytest.param('win', 'release')
    pytest.param('win', 'debug')))
def test_Foo(self):

我想做以下事情:

pytest -v -m parameterize.configuration.release

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

2 个答案:

答案 0 :(得分:2)

官方answer by hoefling的替代方法是使用pytest-pilot创建一个特殊标记并应用它:

conftest.py:

from pytest_pilot import EasyMarker

mymark = EasyMarker('mymark', has_arg=False, mode='hard_filter')

test_so.py:

import pytest
from .conftest import mymark

@pytest.mark.parametrize('platform,configuration', (
        mymark.param('win', 'release'),
        pytest.param('win', 'debug')
))
def test_foo(platform, configuration):
    pass

您现在可以运行pytest --mymark,它只能正确运行带有标记的测试

test_so\test_so.py::test_foo[win-release] PASSED                         [ 50%]
test_so\test_so.py::test_foo[win-debug] SKIPPED                          [100%]

当然,它可能并非在所有情况下都相关,因为它需要修改代码;但是,对于高级筛选模式,或者如果保留筛选,并且您希望使用一些CLI快捷方式来执行它,可能会很有趣。注意:我是这个库的作者;)

答案 1 :(得分:1)

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

$ pytest -k win-release

将仅运行名称中包含win-release的测试。您可以通过发出

来列出所有名称,而无需执行测试
$ pytest --collect-only -q

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

# 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]

现在您可以例如呼叫

$ pytest --param-name=platform --param-name=win

,只有用platform=win参数化的测试才会执行。