2014-02-10 13 views
6

Ich würde gerne ein Kommandozeilenargument zu py.test für Fixtures erstellen. Zum Beispiel würde Ich mag eine Datenbank Hostnamen in die Halterung Schaffung unten passieren, damit es nicht hart codiert werden:Angabe Fixture-Argument für py.test von der Befehlszeile

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 

Leider ist die Standardeinstellung nicht festgelegt, wenn das Argument von dem weggelassen Befehlszeile:

$ 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' 

Was vermisse ich? ... Übrigens, die Angabe des Hostnamens in der Befehlszeile schlägt ebenfalls fehl:

$ 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!

Antwort

10

Wie ist das Layout Ihrer Dateien? Es scheint, dass Sie versuchen, den gesamten Code in das Modul test_opt.py zu schreiben. Der pytest_addoption() Hook wird jedoch nur aus einer Datei conftest.py gelesen. Sie sollten also versuchen, die pytest_addoption()-Funktion in eine Datei conftest.py im selben Verzeichnis wie test_opt.py zu verschieben.

Im Allgemeinen, während Fixtures in Testmodulen definiert werden können, müssen alle Hooks in eine Datei conftest.py eingefügt werden, damit py.test sie verwenden kann.

+0

Ja, ich versuche alles auf Datei zu bringen. Ich werde versuchen, es aufzubrechen, um zu sehen, was passiert. ... Ich wusste nicht, dass conftest.py eine separate Datei sein musste. ... Vielen Dank! – Trevor

+0

Das war das Problem! Ich habe alles außer der eigentlichen Testfunktion 'test_1 (db)' in eine angrenzende Datei 'conftest.py' verschoben, und es funktionierte großartig! – Trevor