Quindi, ho appena perso un giorno 01 cercando di scoprire perché py.test
non sta eseguendo il mio autouse, setup di sessione e fixture di teardown. Alla fine mi sono imbattuto su (Punta di cappello a this SO comment!) Questo piccolo bocconcino nel plugins documentation:Come posso ottenere py.test per riconoscere conftest.py in una sottodirectory?
noti che conftest.py file da sub directory di default non sono caricati all'avvio strumento.
Nel mio progetto, ho avuto il mio file py.test (conftest.py
e test file) in una sottodirectory tests/
, che sembra una configurazione piuttosto standard. Se eseguo py.test
nella directory dei test, tutto viene eseguito correttamente. Se eseguo py.test
nella directory principale del progetto, i test continuano a essere eseguiti, ma le routine di installazione/disattivazione non vengono mai eseguite.
Domande:
- Qual è il modo "canonica" per consentire agli utenti di eseguire correttamente i test dalla radice dir progetto? Mettere
conftest.py
nella directory radice mi sembra strano, perché ritengo che tutti i file relativi ai test debbano rimanere nella sottodirectorytests
. - Perché (design-saggio) non sono le sottodirectory
conftest.py
nelle sottodirectory non caricate di default? Trovo questo comportamento curioso a dir poco, considerando che i test nelle sottodirectory vengono scoperti di default, quindi sembra esserci un piccolo sforzo aggiuntivo per trovare anche i file di conftest. - Infine, come è possibile caricare
conftest.py
nelle sottodirectory (ovvero passare dall'impostazione predefinita)? Non ho trovato questo nei documenti. Vorrei evitare ulteriori argomenti della console se possibile, quindi posso inserire qualcosa in un file di configurazione o whatnot?
Qualsiasi intuizione e suggerimenti sono molto apprezzati, sento che ho perso/perso molto tempo a diagnosticare questo quando ho potuto scrivere test per il mio progetto. :-(
Esempio minimo:
# content of tests/conftest.py
# adapted from http://pytest.org/latest/example/special.html
import pytest
def tear_down():
print "\nTEARDOWN after all tests"
@pytest.fixture(scope="session", autouse=True)
def set_up(request):
print "\nSETUP before all tests"
request.addfinalizer(tear_down)
file di test:
# content of tests/test_module.py
class TestClassA:
def test_1(self):
print "test A1 called"
def test_2(self):
print "test A2 called"
class TestClassB:
def test_1(self):
print "test B1 called"
Console uscita:
pytest_experiment$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items
tests/test_module.py test A1 called
.test A2 called
.test B1 called
.
====================================================== 3 passed in 0.02 seconds ======================================================
pytest_experiment$ cd tests/
pytest_experiment/tests$ py.test -s
======================================================== test session starts =========================================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.2
plugins: cov
collected 3 items
test_module.py
SETUP before all tests
test A1 called
.test A2 called
.test B1 called
.
TEARDOWN after all tests
====================================================== 3 passed in 0.02 seconds ======================================================
Funziona bene per me. http://ascii.io/a/5263 – falsetru
sì, nel frattempo ho scoperto che questo era un bug già risolto da sempre. – Christoph