Chcę napisać test, aby ustalić, że wyjątek nie jest zgłaszany w danych okolicznościach.
Łatwo jest sprawdzić, czy zgłoszony został wyjątek ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... ale jak możesz zrobić odwrotnie .
Coś w tym stylu, o co mi chodzi ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
jaskra
źródło
źródło
assertNotRaises
metodę, która dzieli 90% jego kodu / zachowaniaassertRaises
w około 30-liniowych wierszach kodu. Zobacz moją odpowiedź poniżej, aby uzyskać szczegółowe informacje.hypothesis
aby upewnić się, że generują takie same dane wyjściowe dla wszystkich rodzajów danych wejściowych, ignorując przypadki, w których oryginał zgłasza wyjątek.assume(func(a))
nie działa, ponieważ dane wyjściowe mogą być tablicą o niejednoznacznej wartości prawdy. Chcę tylko wywołać funkcję i uzyskać,True
jeśli się nie powiedzie.assume(func(a) is not None)
prace chybaOdpowiedzi:
źródło
ValueError
, aleValueError
zamiast tego jest podniesiony, twój test musi zakończyć się warunkiem błędu, a nie błędu. Z drugiej strony, jeśli uruchomisz ten sam kod, zgłosiłbyśKeyError
błąd, a nie błąd. W Pythonie - inaczej niż w niektórych innych językach - rutynowo stosuje się wyjątki dla przepływu sterowania, dlatego rzeczywiście mamyexcept <ExceptionName>
składnię. W tym względzie rozwiązanie user9876 jest po prostu złe.Takie jest domyślne założenie - wyjątki nie są zgłaszane.
Jeśli nie powiesz nic więcej, jest to zakładane w każdym teście.
Nie musisz tak naprawdę pisać żadnych twierdzeń.
źródło
Wystarczy wywołać funkcję. Jeśli zgłosi wyjątek, środowisko testów jednostkowych oznaczy to jako błąd. Możesz dodać komentarz, np .:
źródło
xfail
Jestem oryginalnym plakatem i przyjąłem powyższą odpowiedź przez DGH bez wcześniejszego użycia jej w kodzie.
Kiedy już skorzystałem, zdałem sobie sprawę, że trzeba było trochę ulepszyć, aby faktycznie zrobić to, czego potrzebowałem (aby być uczciwym wobec DGH, on / ona powiedział „lub coś podobnego”!).
Pomyślałem, że warto zamieścić tutaj ulepszenie z korzyścią dla innych:
To, co próbowałem tutaj zrobić, to upewnić się, że jeśli podjęta zostanie próba utworzenia wystąpienia obiektu aplikacji z drugim argumentem spacji, pySourceAidExceptions.PathIsNotAValidOne zostanie podniesiony.
Wierzę, że użycie powyższego kodu (opartego w dużej mierze na odpowiedzi DGH) to zrobi.
źródło
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
powinien wykonać pracę w tym przypadku.Możesz zdefiniować
assertNotRaises
, ponownie wykorzystując około 90% oryginalnej implementacjiassertRaises
wunittest
module. Dzięki takiemu podejściu uzyskuje sięassertNotRaises
metodę, która oprócz odwróconego stanu awarii zachowuje się identycznieassertRaises
.TLDR i demo na żywo
Okazuje się, że dodanie
assertNotRaises
metody jest zaskakująco łatweunittest.TestCase
(napisanie tej odpowiedzi zajęło mi około 4 razy więcej czasu niż kodu). Oto demo na żywoassertNotRaises
metody w akcji . Tylko jakassertRaises
, można przejść wywoływalnym i args sięassertNotRaises
, czy można go używać wwith
oświadczeniu. Demo na żywo zawiera przypadki testowe, które pokazują, żeassertNotRaises
działa zgodnie z przeznaczeniem.Detale
Realizacja
assertRaises
wunittest
jest dość skomplikowana, ale przy odrobinie sprytnej podklasy można zastąpić i odwrócić jej stan awarii.assertRaises
jest krótką metodą, która w zasadzie tworzy instancjęunittest.case._AssertRaisesContext
klasy i zwraca ją (patrz jej definicja wunittest.case
module). Możesz zdefiniować własną_AssertNotRaisesContext
klasę, podklasując_AssertRaisesContext
i zastępując jej__exit__
metodę:Zwykle klasy przypadków testowych są definiowane przez dziedziczenie
TestCase
. Jeśli zamiast tego dziedziczysz z podklasyMyTestCase
:wszystkie twoje przypadki testowe będą teraz miały
assertNotRaises
dostępną dla nich metodę.źródło
traceback
w swoimelse
oświadczeniu pochodzących z?import
. Naprawionomożna zmodyfikować, jeśli musisz zaakceptować parametry.
zadzwoń jak
źródło
Uważam, że przydatne jest łatanie małp
unittest
w następujący sposób:To wyjaśnia cel podczas testowania pod kątem braku wyjątku:
Upraszcza to również testowanie w pętli, co często robię:
źródło
assertMayRaise
dounittest.TestSuite
was może udawać, że to częśćunittest
biblioteki.Jeśli przekażesz klasę wyjątków, otrzymasz
assertRaises()
menedżera kontekstu. Może to poprawić czytelność twoich testów:Umożliwia to testowanie przypadków błędów w kodzie.
W takim przypadku testowane
PathIsNotAValidOne
jest podniesienie podczas przekazywania niepoprawnych parametrów do konstruktora aplikacji.źródło
możesz spróbować w ten sposób. try: self.assertRaises (None, function, arg1, arg2) oprócz: pass, jeśli nie umieścisz kodu w środku, spróbuj zablokować to poprzez wyjątek „AssertionError: None not failed” i przypadek testowy zakończy się niepowodzeniem. Przypadek testowy zostanie zaliczony jeśli jest w środku spróbuj bloku, którego zachowanie jest oczekiwane.
źródło
Jednym prostym sposobem na zapewnienie inicjalizacji obiektu bez żadnego błędu jest przetestowanie instancji typu obiektu.
Oto przykład :
źródło