Mam metodę Pythona 2.7, która czasami wywołuje
sys.exit(1)
Czy można wykonać test jednostkowy, który weryfikuje, że ta linia kodu jest wywoływana, gdy spełnione są odpowiednie warunki?
python
unit-testing
Travis Bear
źródło
źródło
Odpowiedzi:
Tak.
sys.exit
podbijaSystemExit
, więc możesz to sprawdzićassertRaises
:Instancje
SystemExit
mają atrybut,code
który jest ustawiony na proponowany status wyjścia, a menedżer kontekstu zwrócony przezassertRaises
ma przechwyconą instancję wyjątku jakoexception
, więc sprawdzenie statusu wyjścia jest łatwe:sys.exit Dokumentacja :
źródło
sys.exit(1)
(w przeciwieństwie do, powiedzmy,sys.exit(0)
), musisz potwierdzić, że jegocode
wynosi 1. Myślę, że mógłbyś to zrobić zassertRaisesRegexp(SystemExit, '1')
?unittest
metoda, która pozwala przekazać wyjątek i wywoływalny predykat do uruchomienia na wyjątku lub jego argumentach, zamiast po prostu wzorca regex do uruchomienia na łańcuchowej reprezentacji jego pierwszego argumentu… ale myślę, że nie. Czy myślę o jakimś innym module testowym?self.assertRaisesRegex( SystemExit, '^2$', testMethod )
mniej kodu, wystarczająco czytelny.self.assertRaisesRegexp
Oto kompletny przykład roboczy. Pomimo doskonałej odpowiedzi Pavla zajęło mi trochę czasu, zanim to rozgryzłem, więc dołączam ją tutaj w nadziei, że okaże się pomocna.
źródło
Znalazłem odpowiedź na twoje pytanie w dokumentacji Python Unit Testing, wyszukując hasło „Testing for Exceptions”. Na Twoim przykładzie test jednostkowy wyglądałby następująco:
Pamiętaj, aby uwzględnić wszystkie argumenty potrzebne do przetestowania Twojej funkcji.
źródło
Jako dodatkowa uwaga do doskonałej odpowiedzi Pawła, możesz również sprawdzić określone statusy, jeśli są one dostępne w testowanej funkcji. Na przykład, gdyby
your_method()
zawierał następujące elementysys.exit("Error")
, można by przetestować konkretnie pod kątem „błędu”:źródło