2015-11-03 11 views
7

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.

+2

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

+1

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

+0

Po prostu "assert" jest znacznie bardziej czytelny. Dlatego zawsze używaj 'pytest', jeśli testy zakończą się niepowodzeniem. – o11c

Odpowiedz

-1

Łącze do dokumentów, które znalazłeś, jest poprawną odpowiedzią. Jeśli nie podoba ten styl pisania testów Gorąco polecam korzystania pytest:

http://pytest.org/latest/

pytest wykonał kilka prac, które umożliwia korzystanie z rachunku dochodzić tak, jak chcesz. Ma również wiele innych naprawdę fajnych funkcji, takich jak ich urządzenia.

+3

Używam pytest, jak wspomniano w pytaniu. W jaki sposób roszczenie w dokumentach może zostać uznane za poprawne, gdy biegacz testowy szczęśliwie gromadzi wszystkie wyniki testu i generuje raport niezależnie od tego, czy używasz instrukcji aser lub funkcji pomocnika? – wim

3

Kluczową różnicą między stosowaniem słowa kluczowego assert lub metod dedykowanych jest raport wyjściowy. Należy pamiętać, że oświadczenie następujące po assert jest zawsze True lub False i nie może zawierać żadnych dodatkowych informacji.

assert 3 == 4 

po prostu wyświetli w raporcie AssertionError. Jednak

self.assertTrue(3 == 4) 

daje pewne dodatkowe informacje: AssertionError: False is not true. Nie bardzo pomocne, ale rozważyć:

self.assertEqual(3, 4) 

Jest znacznie lepiej, gdyż mówi, że AssertionError: 3 != 4. Czytasz raport i wiesz, jakiego rodzaju to stwierdzenie (test równości) i wartości.

Załóżmy, że masz jakąś funkcję, a chcą dochodzić wartość powraca. Można to zrobić na dwa sposoby:

# assert statement 
assert your_function_to_test() == expected_result 

# unittest style 
self.assertEqual(your_function_to_test(), expected_result) 

W przypadku wystąpienia błędu, pierwszy daje żadnej informacji poza błędem twierdzenie, drugi mówi, co jest rodzaju twierdzenia (test równości) i co wartości są zaangażowane (wartość zwrócona i oczekiwana).

Dla małych projektów nigdy nie męczyć się z unittest stylu, jak to już wpisywać, ale w dużych projektów może chcesz wiedzieć więcej na temat tego błędu.

+0

Możesz dodać dowolny ciąg znaków do asercji, który ma zostać włączony do podniesionego 'AssertionError':' assert 3 == 4, "3! = 4" '. – chepner

+1

Co ważniejsze, struktura testowa/testowa może automatycznie generować kontekst. – wim

Powiązane problemy