Piszę dużo testów jednostkowych. Niestety mój kod często wymaga poprawnego testowania. Często używam funkcji patch
z biblioteki mock Michaela Foorda (teraz dostępnej w Pythonie 3.4 jako unittest.mock), aby małpa Łatała mój kod.
podczas rozmowy z innymi użytkownikamipatch
zdałem sobie sprawę, że każdy wydaje się mieć swój ulubiony sposób korzystania z niego. W tym poście omówię sposoby używania patcha.,
dekorator
patch może być użyty jako dekorator metody:
lub jako dekorator klasy:
używam patcha jako dekoratora, gdy mam funkcję, którą chcę łatać podczas całego testu. Zazwyczaj nie używam patcha jako dekoratora klasy i wyjaśnię, dlaczego poniżej.
przykład dekoratora
Menedżer kontekstu
patch może być używany jako menedżer kontekstu:
wolę używać patcha jako menedżera kontekstu, gdy chcę łatać funkcję tylko dla części testu. Nie używam patcha jako menedżera kontekstu, gdy chcę, aby funkcja była łatana przez cały test.,
przykład Menedżera kontekstowego
ręcznie za pomocą start i stop
patch może być również użyty do ręcznego łatania/odłączania za pomocąstart
Istop
metody:
wolę używać patcha za pomocą start/stop, gdy potrzebuję funkcji do załatania dla każdej funkcji w klasie testowej.
jest to prawdopodobnie najczęstszy sposób, w jaki używam patcha w moich testach. Często grupuję testy w klasy testowe, w których każda metoda koncentruje się na testowaniu tej samej funkcji. Dlatego zwykle będę chciał, aby te same funkcje/obiekty były łatane dla każdej metody testowej.,
zauważyłem powyżej, że wolę nie używać dekoratorów klas do rozwiązania tego problemu. Zamiast tego wolę używać atrybutów klasy testowej do przechowywania referencji do załatanych funkcji, zamiast akceptować argumenty patch na każdej metodzie testowej z dekoratorami. To jest bardziej suche.
Uwaga: jedną z głównych zalet form patcha decorator/context manager jest to, że zajmują się one czyszczeniem dla Ciebie. Za każdym razem, gdy wywołujesz start
aby skonfigurować obiekt patch, zawsze pamiętaj, aby wywołać stop
aby go wyczyścić., W przeciwnym razie będziesz miał małpę załataną funkcję / obiekt dla reszty uruchomionego programu.
przykład start i stop
podsumowanie
łatka może być używana:
- jako metoda lub dekorator klas
- jako menedżer kontekstu
- używając metod start i stop
wolę, aby moje testy były czytelne, suche i łatwe do modyfikacji. Zazwyczaj używam metod start/stop z tego powodu, ale często używam dekoratorów metod łat i czasami używam menedżerów kontekstu łat., Warto znać różne smaki patch
, ponieważ twój ulubiony smak może nie zawsze być najbardziej odpowiedni dla danego problemu.