2012-09-25 11 views
42

Używanie py.test, dwa testy o tym samym nazwie w innym katalogu powodują niepowodzenie py.test. Dlaczego? Jak mogę to zmienić bez zmiany nazwy wszystkich testów?py.test - niepowodzenie testu testowego, gdy testy w różnych katalogach są nazywane tymi samymi

Aby powielić zrobić:

; 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 ============================ 

Odpowiedz

30

kładąc __init__.py jest jednym ze sposobów rozwiązania konfliktu. W przeciwieństwie do nosa, obecny pytest nie próbuje rozładowywać modułów testowych w celu zaimportowania modułów testowych o tej samej nazwie importu. Kiedyś uważałem, że jest to trochę magiczne, aby zrobić to samo-nieimportowanie i może zepsuć ludzkie oczekiwania z mechanizmu importu; czasami ludzie polegają na stanie globalnym modułu testowego, a przy autowybadań tracą go (moduł testowy importujący z innego modułu testowego może wtedy robić nieoczekiwane rzeczy). Ale może to nie jest praktyczny problem, a zatem pytest mógłby dodać podobny hack ...

+2

Zgadzam się, że wymaganie __init__.py ma sens. Jeśli test nie jest w pakiecie, to jest to zasadniczo moduł najwyższego poziomu (w OP, test_proxy) i powinien być tylko jeden. Umieszczając moduły testowe w odpowiednich pakietach (ook i eek), zapewnia on odpowiednią przestrzeń nazw testów. Mówię, że status quo jest najlepszy. Może to złagodzić ból związany z komunikatem o błędzie dotyczącym tego pytania lub czymś w dokumentach wyjaśniającym rozumowanie i technikę rozwiązania problemu. –

+20

Po prostu notatka, że ​​py.test docs specjalnie odradza wstawianie '__init __. Py' w katalogach testowych: _" unikaj '__init __. Py' plików w katalogach testowych, w ten sposób twoje testy mogą łatwo działać z zainstalowaną wersją mypkg, niezależnie od tego, czy zainstalowany pakiet zawiera testy, czy nie "_. Zaczerpnięte z [pytest.org - Good Integration Practices] (http://pytest.org/latest/goodpractises.html#choosing-a-test-layout-import-rules). – famousgarkin

+1

Aktualizacja: Rekomendacja w komentarzu @ famousgarkin powyżej i odpowiedź (https://stackoverflow.com/a/21942491/260303) wydaje się już nie być w dokumentach (przynajmniej wyszukiwanie "unikaj" nie wywołuje cytatu powyżej): https://docs.pytest.org/en/latest/goodpractices.html#tests-as-part-of-application-code. W rzeczywistości przykłady w tym łączu pokazują '__init __. Py' w katalogach testowych, więc wydaje się, że zaakceptowana odpowiedź jest poprawna. –

14

To jest aktualna funkcja py.test. Można znaleźć przyczynę tego zachowania podanej w pytest.org - Good Integration Practices - Choosing a test layout/import rules:

  • unikać __init__.py plików w katalogach testowych. W ten sposób testy mogą być łatwe do zainstalowania na zainstalowanej wersji mypkg, niezależnie od tego, czy zainstalowany pakiet zawiera testy, czy nie.

Jak to zalecany obieg pracy z py.test: zainstalować pakiet w fazie rozwoju z pip install -e, a następnie go przetestować.

Z tego powodu sam wybieram unikalne nazwy testowe, w konwencji w stosunku do sposobu konfiguracji. Gwarantuje to również, że nie otrzymasz niejednoznacznych nazw testowych w różnych wynikach testu.

Jeśli zachodzi potrzeba zachowania nazw testowych i nie dbanie o wyżej wspomnianą funkcjonalność, powinieneś być w porządku z umieszczeniem __init__.py.

+0

Nie otrzymuję przypadku użycia: "W ten sposób twoje testy mogą być łatwe do uruchomienia z zainstalowaną wersją mypkg". Przeprowadzam testy przeciwko mojej rozwojowej wersji 'mypkg'. W ten sposób testy istnieją. Tworzę pliki '__init __. Py', aby uniknąć tego komunikatu o błędzie" unique basename ". – guettli

+1

Utworzono żądanie funkcji, aby zmienić dokumenty: https: // bitbucket.org/hpk42/pytest/issue/529/unique-basename-and -__ init__py-docs – guettli

+1

@guettli Ten przypadek użycia ma miejsce wtedy, gdy chcesz przetestować pakiet jako zainstalowany przez setup.py. Można to wykorzystać, aby upewnić się, że uwzględniłeś wszystkie wymagane pliki w instalacji, takie jak dane dołączone i że wszystkie zależności są obsługiwane poprawnie. Może być również użyty do instalacji w środowiskach, w których system docelowy nie ma kompilatora i do instalacji używasz binarnego jajka lub koła. –

Powiązane problemy