我从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,并且我想避免编写大量的测试参数。包装器测试。
答案 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
参数化的测试才会执行。