How to pass arguments in pytest by command line How to pass arguments in pytest by command line python python

How to pass arguments in pytest by command line


In your pytest test, don't use @pytest.mark.parametrize:

def test_print_name(name):    print ("Displaying name: %s" % name)

In conftest.py:

def pytest_addoption(parser):    parser.addoption("--name", action="store", default="default name")def pytest_generate_tests(metafunc):    # This is called for every test. Only get/set command line arguments    # if the argument is specified in the list of test "fixturenames".    option_value = metafunc.config.option.name    if 'name' in metafunc.fixturenames and option_value is not None:        metafunc.parametrize("name", [option_value])

Then you can run from the command line with a command line argument:

pytest -s tests/my_test_module.py --name abc


Use the pytest_addoption hook function in conftest.py to define a new option.
Then use pytestconfig fixture in a fixture of your own to grab the name.
You can also use pytestconfig from a test to avoid having to write your own fixture, but I think having the option have it's own name is a bit cleaner.

# conftest.pydef pytest_addoption(parser):    parser.addoption("--name", action="store", default="default name")
# test_param.py import pytest@pytest.fixture()def name(pytestconfig):    return pytestconfig.getoption("name")def test_print_name(name):        print(f"\ncommand line param (name): {name}")def test_print_name_2(pytestconfig):    print(f"test_print_name_2(name): {pytestconfig.getoption('name')}")
# in action$ pytest -q -s --name Brian test_param.pytest_print_name(name): Brian.test_print_name_2(name): Brian.


I stumbled here looking for how to pass an argument, but I wanted to avoid parameterizing the test. The answers above do perfectly well address the exact question of parameterizing a test from the command line, but I would like to offer an alternative way to pass a command line argument to particular tests. The method below uses a fixture and skips the test if the fixture is specified but the argument is not:

test.py:

def test_name(name):    assert name == 'almond'

conftest.py:

import pytestdef pytest_addoption(parser):    parser.addoption("--name", action="store")@pytest.fixture(scope='session')def name(request):    name_value = request.config.option.name    if name_value is None:        pytest.skip()    return name_value

Examples:

$ py.test tests/test.py=========================== test session starts ============================platform linux -- Python 3.7.1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0rootdir: /home/ipetrik/dev/pytest_test, inifile:collected 1 itemtests/test.py s                                                      [100%]======================== 1 skipped in 0.06 seconds =========================

$ py.test tests/test.py --name notalmond=========================== test session starts ============================platform linux -- Python 3.7.1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0rootdir: /home/ipetrik/dev/pytest_test, inifile:collected 1 itemtests/test.py F                                                      [100%]================================= FAILURES =================================________________________________ test_name _________________________________name = 'notalmond'    def test_name(name):>       assert name == 'almond'E       AssertionError: assert 'notalmond' == 'almond'E         - notalmondE         ? ---E         + almondtests/test.py:5: AssertionError========================= 1 failed in 0.28 seconds =========================

$ py.test tests/test.py --name almond=========================== test session starts ============================platform linux -- Python 3.7.1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0rootdir: /home/ipetrik/dev/pytest_test, inifile:collected 1 itemtests/test.py .                                                      [100%]========================= 1 passed in 0.03 seconds =========================