Pytest select tests based on mark.parameterize value?

You can use -k for expression-based filtering:

$ pytest -k win-release

will run only tests containing win-release in their names. You can list all names without executing the tests by issuing

$ pytest --collect-only -q

Should an expression be not enough, you can always extend pytest by adding your custom filtering logic, for example by passing parameter name and value via command line args and selecting only tests that are parametrized accordingly:

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

Now you can e.g. call

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

and only tests parametrized with platform=win will be executed.


An alternative to the official answer by hoefling is to create a special marker with pytest-pilot and to apply it:

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

You can now run pytest --mymark, it correctly runs only the test with the mark

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

Of course it might not be relevant in all cases, as it requires code modification ; however for advanced filtering patterns, or if the filtering is here to stay and you wish to have some CLI shortcuts to perform it, it might be interesting. Note: I'm the author of this lib ;)

Tags:

Python

Pytest