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 assert
słowo kluczowe java (AssertionError), więc jest dokładnie taki sam, jak assertTrue
i 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 assertTrue
jest lepszą praktyką, ponieważ gwarantuje wykonanie testu, zapewnia spójność (czasami używasz assertThat
lub 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 assert
instrukcja i, co ważniejsze, nie muszą być jawnie włączane, w przeciwieństwie do tego assert
, co wymaga -ea
argumentu JVM.
-ea
jest 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";
.
assert
moż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?
Assert
wymagałby więcej kotłów. assert
bez 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ść.