Użyłem easy_install, aby zainstalować pytest na komputerze Mac i zacząłem pisać testy dla projektu o strukturze plików podobnej do następującej:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
uruchom py.test
w katalogu repo, wszystko zachowuje się tak, jak można się spodziewać
ale kiedy próbuję tego samego na Linuksie lub Windowsie (oba mają na sobie pytest 2.2.3), szczeka za każdym razem, gdy natrafi na pierwszy import czegoś z mojej ścieżki aplikacji. Powiedz na przykładfrom app import some_def_in_app
Czy muszę edytować moją PATH, aby uruchomić py.test na tych systemach? Czy ktoś tego doświadczył?
python
unit-testing
pytest
MattoTodd
źródło
źródło
Odpowiedzi:
Tak, folder źródłowy nie znajduje się w ścieżce Pythona, jeśli przejdziesz
cd
do katalogu testów.Masz 2 możliwości:
Dodaj ścieżkę ręcznie do plików testowych, mniej więcej tak:
Uruchom testy z env var
PYTHONPATH=../
.źródło
cd
idę do katalogu? uruchamiampy.test
z mojego katalogu głównego. chyba że się mylę i masz na myśli, gdy pytający przechodzi przez moje folderycd
problem, czy nie trafiłbym go również na Maca?Nie jestem pewien, dlaczego py.test nie dodaje bieżącego katalogu do samej PYTHONPATH, ale oto obejście (do wykonania z katalogu głównego repozytorium):
Działa, ponieważ Python dodaje dla ciebie bieżący katalog w PYTHONPATH.
źródło
project/test/all-my-tests
i zproject/src/app.py
powodu tej zmiany należy wywołaćapp.py
pośrednio, używając__main__.py
pliku wproject/src
, aby można było użyć wywołaniapython -m src
. O ile wiem, dość niechlujne rzeczy./home/user/dev/projectxyz/src ...
byłyby naprawdę złe i w większości przypadków nie działałyby na innych komputerach. Myślę, że miałem na myśli to, że zawsze muszę zapisywać cały katalog główny projektu do ścieżki modułu, nawet jeśli moduł znajduje się w tym samym folderze, co plik. Nie wiedziałem, że jest to uważane za najlepszą praktykę, więc to przydatna informacja, dzięki. Zgadzam się z większością pep8, chociaż wciąż nie jest doskonały.__init__.py
w testach, które rozwiązały problem. Teraz mogę użyćpytest
conftest
rozwiązanieNajmniej inwazyjne rozwiązanie polega na dodaniu pustego pliku o nazwie
conftest.py
wrepo/
katalogu:Otóż to. Nie ma potrzeby pisania niestandardowego kodu w celu manipulacji
sys.path
lub pamiętaj, aby przeciągaćPYTHONPATH
lub umieszczać__init__.py
w katalogach, w których nie należy.Katalog projektu następnie:
Wyjaśnienie
pytest
szukaconftest
modułów w kolekcji testowej, aby zebrać niestandardowe zaczepy i urządzenia, a aby zaimportować z nich niestandardowe obiekty,pytest
dodaje katalog nadrzędnyconftest.py
dosys.path
(w tym przypadkurepo
katalogu).Inne struktury projektu
Jeśli masz inną strukturę projektu, umieść
conftest.py
katalog w katalogu głównym pakietu (ten, który zawiera pakiety, ale sam nie jest pakietem, więc nie zawiera an__init__.py
), na przykład:src
układChociaż tego podejścia można użyć z
src
układem (umieśćconftest.py
w katalogusrc
):uwaga, że dodanie w
src
celuPYTHONPATH
złagodzenia znaczenia i zaletsrc
układu! Skończysz na testowaniu kodu z repozytorium, a nie zainstalowanego pakietu. Jeśli musisz to zrobić, może wcale nie potrzebujeszsrc
reż.Dokąd się udać?
Oczywiście
conftest
moduły to nie tylko niektóre pliki, które pomagają w odkrywaniu kodu źródłowego; w tym miejscu mają miejsce wszystkie udoskonaleniapytest
frameworku specyficzne dla projektu i dostosowanie pakietu testowego.pytest
ma wiele informacji oconftest
modułach rozrzuconych po ich dokumentach ; zacznij odconftest.py
: lokalnych wtyczek dla poszczególnych katalogówPonadto SO ma doskonałe pytanie dotyczące
conftest
modułów: W py.test, do czego służą pliki conftest.py?źródło
pytest
i zdecydowanie odradzam to . W ten sposób sadzisz nasiona na przyszłe błędy. Utwórz kolejny moduł o nazwieutils.py
i umieść tam kod do ponownego użycia w testach.conftest.py
nie należy do kodu aplikacji i, imo, umieszczenie go podsrc/
jest nieprawidłowe.Miałem ten sam problem. Naprawiłem to, dodając pusty
__init__.py
plik do mojegotests
katalogu.źródło
avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.
SRC: pytest.org/latest/goodpractises.html__init__.py
z mojego katalogu testów rozwiązało to dla mnie.__init__.py
podkatalogówtest/
sprawia, że import absolutny działa w celu uruchomienia określonych testów w tym podkatalogu w stosunku do przyszłych modułów. Dzięki.Uruchom
pytest
się jako moduł z:python -m pytest tests
źródło
python -m pytest
bez żadnego wyjaśnienia innego niż „ponieważ to działa”package/src package/tests
itests
importujesz zsrc
. Wykonanie jako moduł będzie traktować importowanie jako bezwzględne niż w stosunku do lokalizacji wykonania.Możesz uruchomić PYTHONPATH w katalogu głównym projektu
Lub użyj instalacji pip jako importu do edycji
źródło
test
katalog nie był wsrc
strukturze katalogów i wywołanie z katalogu zawierającego zarówno katalog, jaktest
isrc
katalog.Stworzyłem to jako odpowiedź na twoje pytanie i moje własne zamieszanie. Mam nadzieję, że to pomoże. Zwróć uwagę na PYTHONPATH zarówno w wierszu poleceń py.test, jak i na stronie tox.ini.
https://github.com/jeffmacdonald/pytest_test
W szczególności: musisz powiedzieć py.test i toks, gdzie znaleźć moduły, które dołączasz.
Z py.test możesz to zrobić:
I z toks, dodaj to do swojego tox.ini:
źródło
Miałem ten sam problem w Flask.
Kiedy dodałem:
do folderu testów problem zniknął :)
Prawdopodobnie aplikacja nie mogła rozpoznać testów folderów jako modułu
źródło
Naprawiłem to, usuwając najwyższy poziom
__init__.py
w folderze nadrzędnym moich źródeł.źródło
Zacząłem dostawać dziwne
ConftestImportFailure: ImportError('No module named ...
błędy, gdy przypadkowo dodałem__init__.py
plik do mojego katalogu src (który nie miał być pakietem Pythona, tylko kontenerem całego źródła).źródło
Otrzymałem ten błąd z powodu czegoś jeszcze prostszego (można nawet powiedzieć, że jest trywialny). Nie zainstalowałem
pytest
modułu. Więc prostyapt install python-pytest
to dla mnie naprawił.„pytest” zostałoby wymienione w pliku setup.py jako zależność testowa. Upewnij się, że zainstalowałeś również wymagania testowe.
źródło
Miałem podobny problem.
pytest
nie rozpoznałem modułu zainstalowanego w środowisku, w którym pracowałem.Rozwiązałem go, instalując się
pytest
w tym samym środowisku.źródło
Dla mnie problem został
tests.py
wygenerowany przez Django wraz ztests
katalogiem. Usunięcietests.py
rozwiązało problem.źródło
Wystąpił ten błąd, ponieważ nieprawidłowo użyłem importu względnego. W przykładzie OP test_app.py powinien importować funkcje przy użyciu np
Jakkolwiek pliki __init__.py są swobodnie rozproszone wokół struktury plików, to nie działa i tworzy rodzaj ImportError, chyba że pliki i pliki testowe znajdują się w tym samym katalogu.
Oto przykład tego, co miałem do czynienia z jednym z moich projektów:
Oto struktura mojego projektu:
Aby uzyskać dostęp do activity_indicator.py z test_activity_indicator.py musiałem:
źródło
Bardzo często testy były przerywane z powodu niemożności zaimportowania modułu. Po badaniach dowiedziałem się, że system patrzy na plik w niewłaściwym miejscu i możemy łatwo rozwiązać problem, kopiując plik zawierający moduł w ten sam folder, jak podano, w celu prawidłowego zaimportowania. Inną propozycją rozwiązania byłaby zmiana deklaracji importu i pokazanie MutPy poprawnej ścieżki urządzenia. Jednak ze względu na fakt, że wiele jednostek może mieć tę zależność, co oznacza, że musimy zatwierdzić zmiany również w ich deklaracjach, wolimy po prostu przenieść jednostkę do folderu.
źródło
Zgodnie z postem Dirka Avery'ego na Medium (i obsługiwanym przez moje osobiste doświadczenia), jeśli używasz środowiska wirtualnego do swojego projektu, nie możesz użyć ogólnosystemowej instalacji pytest; musisz zainstalować go w środowisku wirtualnym i użyć tej instalacji.
W szczególności, jeśli masz zainstalowany w obu miejscach, to po prostu uruchomienie
pytest
polecenia nie będzie działać, ponieważ będzie korzystało z instalacji systemu. Jak opisano w innych odpowiedziach, jednym z prostych rozwiązań jest uruchomieniepython -m pytest
zamiastpytest
; działa to, ponieważ używa środowiska pytest w środowisku. Alternatywnie możesz po prostu odinstalować systemową wersję pytest; po reaktywacji środowiska wirtualnegopytest
polecenie powinno działać.źródło
python -m pytest tests/
.Miałem ten sam problem, postępując zgodnie z samouczkiem Flask i znalazłem odpowiedź na oficjalnych dokumentach Pytest. To trochę zmienia sposób, w jaki ja (i myślę, że wielu innych) jestem przyzwyczajony do robienia rzeczy.
Musisz utworzyć
setup.py
plik w katalogu głównym projektu z co najmniej dwoma następującymi wierszami:gdzie PACKAGENAME to nazwa Twojej aplikacji. Następnie musisz zainstalować go za pomocą pip:
-e
Flaga mówi pip aby nienaruszony pakiet w edytowalny lub „rozwijać” tryb. Więc przy następnym uruchomieniupytest
powinna znaleźć twoją aplikację w standardziePYTHONPATH
.źródło
Moje rozwiązanie:
utwórz
conftest.py
plik wtest
katalogu zawierającym:Spowoduje to dodanie folderu będącego przedmiotem zainteresowania do ścieżki Pythona bez modyfikowania każdego pliku testowego , ustawiania zmiennej env lub bałagania za pomocą ścieżek bezwzględnych / względnych.
źródło