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?
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?
Odpowiedzi:
Tak. sys.exit
podbija SystemExit
, więc możesz to sprawdzić assertRaises
:
with self.assertRaises(SystemExit):
your_method()
Instancje SystemExit
mają atrybut, code
który jest ustawiony na proponowany status wyjścia, a menedżer kontekstu zwrócony przez assertRaises
ma przechwyconą instancję wyjątku jako exception
, więc sprawdzenie statusu wyjścia jest łatwe:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception.code, 1)
Wyjdź z Pythona. Jest to realizowane poprzez podniesienie
SystemExit
wyjątku ... możliwe jest przechwycenie próby wyjścia na poziomie zewnętrznym.
sys.exit(1)
(w przeciwieństwie do, powiedzmy, sys.exit(0)
), musisz potwierdzić, że jego code
wynosi 1. Myślę, że mógłbyś to zrobić z assertRaisesRegexp(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.
import unittest
from glf.logtype.grinder.mapping_reader import MapReader
INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping"
class TestMapReader(unittest.TestCase):
def test_get_tx_names_incomplete_mapping_file(self):
map_reader = MapReader()
with self.assertRaises(SystemExit) as cm:
tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE)
self.assertEqual(cm.exception.code, 1)
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:
self.assertRaises(SystemExit, your_function, argument 1, argument 2)
Pamiętaj, aby uwzględnić wszystkie argumenty potrzebne do przetestowania Twojej funkcji.
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 elementy sys.exit("Error")
, można by przetestować konkretnie pod kątem „błędu”:
with self.assertRaises(SystemExit) as cm:
your_method()
self.assertEqual(cm.exception, "Error")