Niedawno odkryłem pytest
. Wygląda świetnie. Wydaje mi się jednak, że dokumentacja mogłaby być lepsza.
Próbuję zrozumieć, do jakich conftest.py
plików mają być używane.
W moim (obecnie małym) pakiecie testowym mam jeden conftest.py
plik w katalogu głównym projektu. Używam go do definiowania urządzeń, które wprowadzam do moich testów.
Mam dwa pytania:
- Czy to prawidłowe użycie
conftest.py
? Czy ma inne zastosowania? - Czy mogę mieć więcej niż jeden
conftest.py
plik? Kiedy chciałbym to zrobić? Przykłady będą mile widziane.
Mówiąc bardziej ogólnie, w jaki sposób zdefiniowałbyś cel i poprawne wykorzystanie conftest.py
plików w pakiecie testowym py.test?
It seems great. However, I feel the documentation could be better.
conftest.py
i chociaż istnieje wiele odniesień do robienia tego lub robienia tego z plikiem poufnym, nigdzie w dokumentacji nigdzie nie wskazuje, że kiedy pytest wykonuje testowe wykrywanie, znaleziono wszystkie pliki conftest.py (w katalog strucutre, nad którym odbywa się wykrywanie testu) zostanie uruchomiony podczas fazy zbierania testów (przed uruchomieniem jakichkolwiek testów). Musiałem to odkryć poprzez eksperymenty.Odpowiedzi:
Tak to jest. Oprawy są potencjalnym i powszechnym zastosowaniem
conftest.py
. Urządzenia, które zdefiniujesz, będą współużytkowane przez wszystkie testy w twoim zestawie testów. Jednak zdefiniowanie urządzeń w katalogu głównymconftest.py
może być bezużyteczne i spowolniłoby testowanie, gdyby takie urządzenia nie były używane we wszystkich testach.Tak.
Urządzenia : Zdefiniuj urządzenia dla danych statycznych używanych przez testy. Dostęp do tych danych mają wszystkie testy w pakiecie, chyba że określono inaczej. Mogą to być zarówno dane, jak i moduły pomocnicze, które zostaną przekazane do wszystkich testów.
Ładowanie zewnętrznych wtyczek :
conftest.py
służy do importowania zewnętrznych wtyczek lub modułów. Poprzez zdefiniowanie następującej zmiennej globalnej, pytest załaduje moduł i udostępni go do testu. Wtyczki to na ogół pliki zdefiniowane w projekcie lub inne moduły, które mogą być potrzebne w testach. Możesz również załadować zestaw predefiniowanych wtyczek, jak wyjaśniono tutaj .pytest_plugins = "someapp.someplugin"
Haki : możesz określić haki, takie jak metody konfiguracji i porzucenia i wiele więcej, aby poprawić swoje testy. Zestaw dostępnych haczyków znajdziesz tutaj . Przykład:
Testuj ścieżkę katalogu głównego : jest to trochę ukryta funkcja. Po zdefiniowaniu
conftest.py
w ścieżce katalogu głównego będzieszpytest
rozpoznawał moduły aplikacji bez określaniaPYTHONPATH
. W tle py.test modyfikuje twojesys.path
, włączając wszystkie podmoduły znalezione ze ścieżki root.Tak, możesz i jest to zdecydowanie zalecane, jeśli twoja struktura testu jest nieco złożona.
conftest.py
pliki mają zasięg katalogu. Dlatego tworzenie ukierunkowanych urządzeń i pomocników jest dobrą praktyką.Kilka skrzynek może pasować:
Tworzenie zestawu narzędzi lub haków dla określonej grupy testów.
root / mod / conftest.py
Ładowanie zestawu urządzeń dla niektórych testów, ale nie dla innych.
root / mod / conftest.py
root / mod2 / conftest.py
root / mod2 / test.py
Wydrukuje „jakieś inne rzeczy”.
Przesłanianie haków odziedziczonych z katalogu głównego
conftest.py
.root / mod / conftest.py
root / conftest.py
Po uruchomieniu dowolnego testu w środku
root/mod
drukowane jest tylko „Jestem modem”.Możesz przeczytać więcej o
conftest.py
tutaj .EDYTOWAĆ:
Możesz użyć
conftest.py
do zdefiniowania swoich pomocników. Powinieneś jednak przestrzegać powszechnej praktyki. Pomocników można używać jako urządzeń przynajmniej wpytest
. Na przykład w moich testach mam fałszywego pomocnika redis, który w ten sposób wstrzykuję do moich testów.root / helper / redis / redis.py
root / testy / stuff / conftest.py
root / testy / stuff / test.py
Będzie to moduł testowy, który możesz swobodnie importować w swoich testach. UWAGA: możesz potencjalnie nazwać
redis.py
tak,conftest.py
jakby Twój modułredis
zawierał więcej testów. Praktyka ta jest jednak odradzana z powodu niejasności.Jeśli chcesz użyć
conftest.py
, możesz po prostu umieścić pomocnika w swoim katalogu głównymconftest.py
i wstrzyknąć go w razie potrzeby.root / testy / conftest.py
root / testy / stuff / test.py
Inną rzeczą, którą możesz zrobić, jest napisanie instalowalnej wtyczki. W takim przypadku pomocnik może zostać napisany w dowolnym miejscu, ale musi zdefiniować punkt wejścia do zainstalowania w twoim i innych potencjalnych ramach testowych. Zobacz to .
Jeśli nie chcesz używać urządzeń, możesz oczywiście zdefiniować prostego pomocnika i po prostu użyć zwykłego starego importu tam, gdzie jest to potrzebne.
root / testy / helper / redis.py
root / testy / stuff / test.py
Jednak tutaj mogą występować problemy ze ścieżką, ponieważ moduł nie znajduje się w folderze podrzędnym testu. Powinieneś być w stanie pokonać to (nie przetestowane), dodając
__init__.py
do swojego pomocnikaroot / testy / pomocnik / __ init__.py
Lub po prostu dodając moduł pomocnika do swojego
PYTHONPATH
.źródło
test_aaaaa.py
próbuje uruchomić się przed zakończeniem konfiguracji urządzeniaconftest.py
. Czy są jakieś przemyślenia, dlaczego tak się dzieje?W szerokim znaczeniu conftest.py to lokalna wtyczka dla poszczególnych katalogów. Tutaj definiujesz specyficzne dla katalogu zaczepy i urządzenia. W moim przypadku mam katalog główny zawierający katalogi testów specyficznych dla projektu. Pewna powszechna magia znajduje się w pliku „root” conftest.py. Specyficzne dla projektu - we własnych. Nie widzę nic złego w przechowywaniu urządzeń w conftest.py, chyba że nie są one powszechnie używane (w takim przypadku wolę zdefiniować je bezpośrednio w plikach testowych)
źródło
Tak , urządzenie zwykle służy do przygotowania danych do wielu testów.
Tak , urządzenie to funkcja uruchamiana
pytest
przed, a czasem po rzeczywistych funkcjach testowych. Kod w urządzeniu może robić, co chcesz. Na przykład, urządzenie może być użyte do uzyskania zestawu danych do testów, lub urządzenie może być również użyte do wprowadzenia systemu do znanego stanu przed uruchomieniem testu.Po pierwsze, możliwe jest umieszczenie urządzeń w poszczególnych plikach testowych. Aby jednak udostępnić urządzenia wielu plikom testowym, musisz użyć
conftest.py
pliku gdzieś centralnie zlokalizowanego dla wszystkich testów. Urządzenia mogą być współużytkowane przez dowolny test. Można je umieścić w osobnych plikach testowych, jeśli chcesz, aby urządzenie było używane tylko przez testy w tym pliku.Po drugie, tak , możesz mieć inne
conftest.py
pliki w podkatalogach katalogu najlepszych testów. Jeśli to zrobisz, urządzenia zdefiniowane w tychconftest.py
plikach niższego poziomu będą dostępne do testów w tym katalogu i podkatalogach.Wreszcie umieszczenie urządzeń w
conftest.py
pliku w testowym katalogu głównym spowoduje, że będą one dostępne we wszystkich plikach testowych.źródło