Dzisiaj widziałem przypadek testowy JUnit z asercją Java zamiast asercji JUnit - czy istnieją istotne zalety lub wady preferowania jednego nad drugim?
Dzisiaj widziałem przypadek testowy JUnit z asercją Java zamiast asercji JUnit - czy istnieją istotne zalety lub wady preferowania jednego nad drugim?
Odpowiedzi:
W JUnit4 wyjątek (właściwie Error) zgłoszony przez potwierdzenie JUnit jest taki sam, jak błąd wyrzucony przez assertsłowo kluczowe java (AssertionError), więc jest dokładnie taki sam, jak assertTruei inny niż ślad stosu, którego nie można było odróżnić.
To powiedziawszy, potwierdzenia muszą działać ze specjalną flagą w JVM, co powoduje, że wiele testów wydaje się zakończonych pomyślnie tylko dlatego, że ktoś zapomniał skonfigurować system z tą flagą, gdy testy JUnit były uruchamiane - niedobrze.
Generalnie z tego powodu argumentowałbym, że korzystanie z JUnit assertTruejest lepszą praktyką, ponieważ gwarantuje wykonanie testu, zapewnia spójność (czasami używasz assertThatlub innych potwierdzeń, które nie są słowem kluczowym Java) i jeśli zachowanie JUnit stwierdza powinien się zmienić w przyszłości (np. podłączenie do jakiegoś rodzaju filtru lub innej przyszłej funkcji JUnit), twój kod będzie w stanie to wykorzystać.
Prawdziwym celem słowa kluczowego assert w java jest możliwość wyłączenia go bez kary w czasie wykonywania. Nie dotyczy to testów jednostkowych.
Preferuję asercje JUnit, ponieważ oferują bogatsze API niż wbudowana assertinstrukcja i, co ważniejsze, nie muszą być jawnie włączane, w przeciwieństwie do tego assert, co wymaga -eaargumentu JVM.
-eajest zawsze włączony mvn test, nie ma potrzeby -ea. Bogatszy interfejs API, dobry chwyt. Czasami myślę, że API jest niewłaściwie używane w teście, ponieważ nie jest częścią aplikacji (a in api), wolę nazywać to po prostu bogatszymi metodami.
Gdy test się nie powiedzie, otrzymasz więcej informacji.
assertEquals(1, 2); prowadzi do java.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2); prowadzi do java.lang.AssertionError
możesz uzyskać jeszcze więcej informacji, dodając argument wiadomości do assertEquals
assert 1==2: "1 is not 2";.
assertmoże być korzystne - poprawności kontroli, które będą miały wpływ wydajności, a zatem są najlepiej domyślnie wyłączone. Jednak z mojego doświadczenia wynika, że większość twierdzeń powinna być zawsze włączona.
Powiedziałbym, że używaj potwierdzeń JUnit w przypadkach testowych i używaj asercji Java w kodzie. Innymi słowy, prawdziwy kod nigdy nie będzie miał zależności JUnit, co jest oczywiste, a jeśli jest to test, powinien używać jego odmian JUnit, a nie assert.
Powiedziałbym, że jeśli używasz JUnit, powinieneś użyć asercji JUnit. assertTrue()jest w zasadzie to samo co assert, w przeciwnym razie po co w ogóle używać JUnit?
Assertwymagałby więcej kotłów. assertbez JUnit wymagałoby napisania całego frameworka.
Może to nie mieć zastosowania, jeśli używasz wyłącznie rzeczy, które są błyszczące i nowe, ale funkcja assert została wprowadzona do Javy dopiero w 1.4SE. Dlatego jeśli musisz pracować w środowisku ze starszą technologią, możesz skłaniać się do JUnit ze względu na kompatybilność.