Dzisiaj widziałem przypadek testowy JUnit z asercją Java zamiast asercji JUnit - czy istnieją istotne zalety lub wady preferowania jednego nad drugim?
java
junit
assert
assertions
Robert
źródło
źródło
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, jakassertTrue
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żywaszassertThat
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.
źródło
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 tegoassert
, co wymaga-ea
argumentu JVM.źródło
-ea
jest zawsze włączonymvn 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 dojava.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2);
prowadzi dojava.lang.AssertionError
możesz uzyskać jeszcze więcej informacji, dodając argument wiadomości do
assertEquals
źródło
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.
źródło
Powiedziałbym, że jeśli używasz JUnit, powinieneś użyć asercji JUnit.
assertTrue()
jest w zasadzie to samo coassert
, w przeciwnym razie po co w ogóle używać JUnit?źródło
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ść.
źródło