parametrize and running a single test in pytest parametrize and running a single test in pytest python python

parametrize and running a single test in pytest


You can specify the tests to run by using the -k flag for filtering tests that match a string expression. When using parametrize, pytest names each test case with the following convention:

test_name['-' separated test inputs]

for example

test_name[First_test_value-Second_test_value-N_test_value]

Selecting an specific test to run is a matter of putting all the above together for example

pytest -k 'my_test[value_1-value_2]'

or

pytest -k my_test\[value_1-value_2\]

You need to escape the square brackets.


I can think of two possible solutions.

  1. Use the name of the test you want to run, and execute it
  2. Use the -k parameter to run tests that match a given substring expression

Solution 1

Use the following command to see the name of the tests without running them:

pytest --collect-only -q # use --co if pytest 5.3.0+ instead of --collect-only

Use the name of the test you want to run, let's say the test is called test_file_name.py::test_name[value1-value2-value3], so use the following command to run it:

pytest test_file_name.py::test_name[value1-value2-value3]

Note: Be sure to use quotes if there are spaces in the identifier.

Solution 2

This solution has been provided by Enrique Saez, and it basically consists of passing part of the name of the test:

pytest -k -value3]


I know this question is answered, but I wasn't satisfied with the answer for my use case.

I have some parametrised tests that take longer than I'd like if I am to run them frequently. It would be useful to be able to pass a parameter to pytest on the command line to set a maximum number of runs for each parametrised test. That way I get resassurance that my code works for some data sets, without having to wait for every data set to be checked, but still preserving the code for testing every data set (to be run less frequently).

I have achieved this by adding the following to my conftest.py

def pytest_addoption(parser):    parser.addoption(        "--limit",        action="store",        default=-1,        type=int,        help="Maximum number of permutations of parametrised tests to run",    )def pytest_collection_modifyitems(session, config, items):    def get_base_name(test_name):        """        Get name of test without parameters        Parametrised tests have the [ character after the base test name, followed by        the parameter values. This removes the [ and all that follows from test names.        """        try:            return test_name[: test_name.index("[")]        except ValueError:            return test_name    limit = config.getoption("--limit")    if limit >= 0:        tests_by_name = {item.name: item for item in items}        test_base_names = set(get_base_name(name) for name in tests_by_name.keys())        tests_to_run = []        for base_name in test_base_names:            to_skip = [t for n, t in tests_by_name.items() if base_name in n][limit:]            for t in to_skip:                t.add_marker("skip")