Setting fixture argument for py.test from command line

I would like to pass the py.test command line argument to create the binding. For example, I would like to pass the hostname of the database to create the device below, so it will not be hardcoded:

import pytest def pytest_addoption(parser): parser.addoption("--hostname", action="store", default='127.0.0.1', help="specify IP of test host") @pytest.fixture(scope='module') def db(request): return 'CONNECTED TO [' + request.config.getoption('--hostname') + '] SUCCESSFULLY!' def test_1(db): print db assert 0 

Unfortunately, the default value is not set if the argument is not specified on the command line:

 $ py.test test_opt.py =================================================================== test session starts ==================================================================== platform linux2 -- Python 2.7.5 -- pytest-2.3.5 collected 1 items test_opt.py E ========================================================================== ERRORS ========================================================================== _________________________________________________________________ ERROR at setup of test_1 _________________________________________________________________ request = <FixtureRequest for <Module 'test_opt.py'>> @pytest.fixture(scope='module') def db(request): > return 'CONNECTED TO [' + request.config.getoption('--hostname') + '] SUCCESSFULLY!' test_opt.py:8: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.Config object at 0x220c4d0>, name = '--hostname' def getoption(self, name): """ return command line option value. :arg name: name of the option. You may also specify the literal ``--OPT`` option instead of the "dest" option name. """ name = self._opt2dest.get(name, name) try: return getattr(self.option, name) except AttributeError: > raise ValueError("no option named %r" % (name,)) E ValueError: no option named '--hostname' 

What am I missing? ... By the way, specifying the host name on the command line also fails:

 $ py.test --hostname=192.168.0.1 test_opt.py Usage: py.test [options] [file_or_dir] [file_or_dir] [...] py.test: error: no such option: --hostname 

TIA!

+6
source share
1 answer

What is the structure of your files? It seems you are trying to put all this code in the test_opt.py module. However, the pytest_addoption() tag will only be read from the conftest.py file. Therefore, you should try moving the pytest_addoption() function to the pytest_addoption() file in the same directory as test_opt.py.

In general, if fixtures can be defined in test modules, any hooks must be placed in the conftest.py file for py.test in order to use them.

+10
source

All Articles