2013-09-01 21 views
15

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 sottodirectory tests.
  • 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 ====================================================== 
+0

Funziona bene per me. http://ascii.io/a/5263 – falsetru

+0

sì, nel frattempo ho scoperto che questo era un bug già risolto da sempre. – Christoph

risposta

9

Dopo qualche aiuto sul canale #pylib IRC, si scopre che questo era un bug che è stato corretto in py.test 2.3.4.

+1

Questo non funziona per me. Ho 'conftest.py' in' tests/'ma non ha alcun effetto. – orome

+0

@raxacoricofallapatorius probabilmente è meglio segnalare un bug contro pytest: https://github.com/pytest-dev/pytest/issues – Christoph

+0

In realtà, nel mio caso è un po 'diverso. Piuttosto che avere 'test /' alla radice del mio pacchetto/progetto, lo ho nella cartella per il modulo (solitario) nel mio pacchetto. Non dovrebbe essere lì? La mia comprensione era che ogni modulo poteva avere la sua cartella 'test /' (e il test posto in tali cartelle viene eseguito). Non è il caso. Dovrei avere una cartella 'test /' (o il mio 'conftest.py') alla radice del mio pacchetto? – orome

Problemi correlati