2012-09-25 13 views
42

Utilizzando py.test, due test chiamato lo stesso nella directory diverse cause py.test a fallire. Perché? Come posso cambiare questo senza rinominare tutti i test?py.test - prova di fallimento scoperta quando i test in diverse directory sono chiamati lo stesso

Per duplicare fare:

; cd /var/tmp/my_test_module 
; mkdir -p ook/test   
; mkdir -p eek/test 
; touch ook/test/test_proxy.py 
; touch eek/test/test_proxy.py 
; py.test 
============================= test session starts ============================== 
platform linux2 -- Python 2.7.3 -- pytest-2.2.4 
collected 0 items/1 errors 

==================================== ERRORS ==================================== 
___________________ ERROR collecting ook/test/test_proxy.py ____________________ 
import file mismatch: 
imported module 'test_proxy' has this __file__ attribute: 
    /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py 
which is not the same as the test file we want to collect: 
    /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py 
HINT: remove __pycache__/.pyc files and/or use a unique basename for your test file modules 
=========================== 1 error in 0.01 seconds ============================ 

risposta

30

porre __init__.py è un modo di risolvere il conflitto. A differenza del nose, current pytest non tenta di scaricare i moduli di test per importare i moduli di test con lo stesso nome di importazione. Ero solito pensare che sia un po 'magico fare questo auto-non importare e potrebbe rovinare le aspettative della gente da ciò che fa il meccanismo di importazione; a volte le persone si affidano allo stato globale di un modulo di test e con lo scaricamento automatico lo si perde (un modulo di test che importa da un altro modulo di test potrebbe quindi fare cose inaspettate). Ma forse non è un problema pratico e quindi pytest potrebbe aggiungere un hack simile ...

+2

Sono d'accordo che richiedono un __init__.py ha un senso. Se un test non è in un pacchetto, allora è essenzialmente un modulo di primo livello (nell'OP, test_proxy) e dovrebbe essercene solo uno. Inserendo i moduli di test in pacchetti rilevanti (ook ed eek), fornisce un giusto namespacing dei test. Dico che lo status quo è il migliore. Potrebbe alleviare un po 'di dolore avere il messaggio di errore link a questa domanda o qualcosa nei documenti che spiega il ragionamento e la tecnica per risolvere il problema. –

+20

Solo una nota che documenti py.test consigliano in particolare contro la messa '__init __ py' nella directory di test:. _" Evitare '__init __ file py' nella tua directory di test In questo modo i test possono essere eseguiti facilmente contro una versione installata di miopacchetto,.. indipendentemente dal fatto che il pacchetto installato contenga o meno i test "_. Tratto da [pytest.org - Good Integration Practices] (http://pytest.org/latest/goodpractises.html#choosing-a-test-layout-import-rules-rules). – famousgarkin

+1

Aggiornamento: La raccomandazione di commento @ di famousgarkin sopra e risposta (https://stackoverflow.com/a/21942491/260303) sembra non essere più nella documentazione (almeno la ricerca di "evitare di" non far apparire la citazione sopra): https://docs.pytest.org/en/latest/goodpractices.html#tests-as-part-of-application-code. In effetti, gli esempi in questo collegamento mostrano '__init __. Py' nelle directory di test, quindi sembra che la risposta accettata sia quella corretta. –

14

Questa è una caratteristica reale di py.test. È possibile trovare il motivo di questo comportamento stabilite da pytest.org - Good Integration Practices - Choosing a test layout/import rules:

  • evitano __init__.py file nelle directory di test. In questo modo i test possono essere eseguiti facilmente contro una versione installata di mypkg, indipendentemente dal fatto che il pacchetto installato contenga o meno i test.

quanto questo è il flusso di lavoro consigliato di lavorare con py.test: installare il pacchetto in fase di sviluppo con pip install -e, poi testarlo.

A causa di questo, mi optare per i nomi di test unici, nella convenzione sulla modalità di configurazione. Garantisce inoltre che non si ottengano nomi di test ambigui nei vari output di test run.

Se è necessario mantenere i nomi dei test e non si preoccupano delle funzionalità sopra menzionate, si consiglia di inserire un numero __init__.py.

+0

Non ho il caso d'uso: "In questo modo i test possono essere eseguiti facilmente contro una versione installata di mypkg". Corro i miei test contro la mia versione di sviluppo di 'mypkg'. In questo modo esistono i test. Creo i file '__init __. Py' per evitare questo messaggio di errore" nome base unico ". – guettli

+1

Ho creato una richiesta di funzionalità per modificare i documenti: https: // bitbucket.org/hpk42/pytest/issue/529/unique-basename-and -__ init__py-docs – guettli

+1

@guettli Il caso d'uso è quando si desidera testare il pacchetto come installato tramite setup.py. Questo può essere usato per assicurarti di includere tutti i file richiesti nell'installazione, come i dati in bundle e che tutte le dipendenze siano gestite correttamente. Può anche essere utilizzato per l'installazione in ambienti in cui il sistema di destinazione non ha un compilatore e si utilizzerà un uovo o una ruota binaria per l'installazione. –

Problemi correlati