W testach Python, dlaczego powinniśmy napisać:Dlaczego nie używać instrukcji assert Pythona w testach, w dzisiejszych czasach?
self.assertEqual(response.status_code, 200)
self.assertIn('key', my_dict)
self.assertIsNotNone(thing)
W przeciwieństwie do naturalnego:
assert response.status_code == 200
assert 'key' in my_dict
assert thing is not None
Dla wielu przypadkach komunikaty o błędach generowane przez metod twierdzenie pomocnicze nie są bardziej czytelne (prawdopodobnie tryb Unitest w stylu camelCase jest czytelny).
Tło mojego projektu:
- Jesteśmy zawsze przy użyciu nowoczesnych biegaczy testowych, takich jak nos lub py.test, a my nie troszczą się o unittest biegacza. Przetestuj odkrycie nawet nie obchodzi, czy klasa ostatecznie dziedziczy
unittest.TestCase
, czy też w ogóle pracujesz w klasie. - Nigdy nie wykonamy automatycznych testów z przełącznikiem -O na interpreter.
- Gdy chcemy uzyskać bardziej czytelny komunikat, domyślny z unittest jest generalnie niewystarczająco dobry - np. istnieje jedna wartość różna, zagnieżdżona w danych json gdzieś i chcemy zobaczyć różnicę kontekstową.
Biblioteki podstawowe i testy CPython nadal generalnie są pisane w stylu unittest i zazwyczaj robią wszystko z ważnego powodu. Moje pytanie brzmi: czy można pracować poza stylem unittest, czy też brakuje mi niektórych wad - dlaczego po prostu nie używać twierdzenia w swoich testach? Dlaczego deweloperzy core nie odeszli jeszcze od unittest?
Uzupełnienie: the docs zrobić wspomnieć powód:
Te metody są stosowane zamiast rachunku assert tak biegacz test może gromadzić wszystkie wyniki badań i przedstawić sprawozdanie
Jednak to uzasadnienie wydaje się być fałszywe, biegacz testu może gromadzić wyniki i raportować jak zwykle, nawet jeśli używasz stwierdzeń assert. W przypadku unutbu w wersji related post pokazano, że unittest spowoduje podniesienie numeru AssertionError
, tak samo jak w przypadku instrukcji assert, i to było ponad 7 lat temu, więc nie jest to również nowa funkcja.
pracuję tak daleko od 'unittest' że używam' print() 'zamiast' assert'. Myślę, że wszystko zależy od złożoności i skali twojego projektu. – TigerhawkT3
Wydaje się, że to głównie kwestia opinii. Jeśli uważasz, że "asert" jest lepszy, to nic nie stoi na przeszkodzie (poza tym, że twoi koledzy się nie zgadzają) z tego. Jednak powinno być wiadomo, że możesz przesłonić metody w klasie 'TestCase' i dostosować zachowanie - instrukcja" assert "nie ma takiej elastyczności. Również 'TestCase.failureException' może zostać zmieniony, co unieważnia twój punkt o tym, że jest to ten sam wyjątek, który jest wyrzucany jak z instrukcji' assert' (może to być użyte, jeśli chcesz wziąć pod uwagę 'assert' zamiast błędu błędu). – skyking
Po prostu "assert" jest znacznie bardziej czytelny. Dlatego zawsze używaj 'pytest', jeśli testy zakończą się niepowodzeniem. – o11c