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.
- Use the name of the test you want to run, and execute it
- 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")