2010-06-03 6 views
61

Dzisiaj widziałem test JUnit z asercją java zamiast twierdzeń JUnit - Czy istnieją znaczące zalety lub wady, które preferują jeden nad drugim?asercja vs JUnit Asercje

+4

Myślę, że to pytanie powinno zostać ponownie otwarte: najwyższa odpowiedź jest niezwykle przydatna. – jakebeal

+0

Istnieją absolutnie rzeczywiste różnice między asercjami JUnit a słowem kluczowym Java "assert". To wcale nie jest pytanie oparte na opiniach. –

Odpowiedz

78

W JUnit4 wyjątek (właściwie Error) rzucony przez assert JUnit jest taka sama jak błędu rzucony przez java assert słowa kluczowego (AssertionError), więc jest dokładnie taka sama jak assertTrue i inne niż ślad stosu ty mogłem” t powiedzieć różnicę.

Zgodnie z tym stwierdzeniem, użytkownik musi uruchamiać specjalną flagę w JVM, powodując, że wiele testów wydaje się być przekazywanych tylko dlatego, że ktoś zapomniał skonfigurować system z tą flagą podczas uruchamiania testów JUnit - nie jest to dobre.

Generalnie, ze względu na to, będę argumentować, że przy użyciu JUnit assertTrue jest lepszą praktyką, ponieważ gwarantuje test jest prowadzony, zapewnia spójność (czasami używać assertThat lub inny twierdzi, że nie są kluczowe java) i jeśli zachowanie JUnit powinno zmienić się w przyszłości (np. wciągnięcie w jakiś filtr lub inną przyszłą funkcję JUnit), twój kod będzie mógł to wykorzystać.

Prawdziwym celem słowa kluczowego assert w języku java jest możliwość wyłączenia go bez karania w czasie wykonywania. Nie dotyczy to testów jednostkowych.

24

Wolę JUnit twierdzeń, ponieważ oferują bogatszy API niż wbudowany assert rachunku, a co ważniejsze nie muszą być jawnie włączone w przeciwieństwie assert, która wymaga argumentu -ea JVM.

+0

'-a' jest zawsze włączone w' mvn test', nie ma potrzeby stosowania '-a'. Bogatsze api, dobry połów. Czasami myślę, że API jest niewłaściwie używany w teście, ponieważ nie jest częścią aplikacji (api), wolę nazywać go po prostu bogatszymi metodami. –

0

Powiedziałbym, że jeśli używasz JUnit, powinieneś użyć asercji JUnit. assertTrue() jest w zasadzie taki sam jak assert, w przeciwnym razie po co używać JUnit?

+2

Używałbyś JUnit dla frameworka testowego. Assert to naprawdę niewielka część wartości, jaką daje JUnit. JUnit bez 'Assert' wymagałby większej liczby elementów. 'assert' bez JUnit wymagałoby napisania całej struktury. – Yishai

+0

Miałem więcej do powiedzenia, jeśli zamierzasz użyć tego narzędzia, użyj narzędzia. regularne stare stwierdzenia twierdzą, że w testowych przypadkach JUnit wydaje się to trochę głupie. W mojej opinii należą one do rzeczywistego kodu. – CheesePls

+0

@CheesePls "regularne stare stwierdzenia twierdzące" są w rzeczywistości bardziej aktualne niż zapewnia JUnit. – dolmen

0

To może nie mieć zastosowania, jeśli używasz wyłącznie rzeczy, które są błyszczące i nowe, ale asercja nie została wprowadzona w Javie przed 1.4SE. Dlatego jeśli musisz pracować w środowisku ze starszą technologią, możesz skłaniać się ku JUnit ze względu na kompatybilność.

11

Po nieudanym teście otrzymujesz więcej informacji.

assertEquals(1, 2); skutkuje java.lang.AssertionError: expected:<1> but was:<2>

vs

assert(1 == 2); wyników w java.lang.AssertionError

można uzyskać jeszcze więcej informacji, jeśli dodać argument wiadomość do assertEquals

+2

spróbuj 'assert 1 == 2:" 1 to nie 2 ";'. –

+0

@PeterRader Spróbuj użyć słowa kluczowego assert, gdy opcja -e nie jest włączona. Albo jeszcze lepiej, użyj asercji JUnit, które zawsze działają. –

+0

@ThomasW gdy opcja -a nie jest włączona, nie jest testem. Uznania JUnit nie zawsze działają, działają tylko wtedy, gdy zdecydujesz się użyć JUnit, co jest ramą, a w przypadku maven i maven dependency, zależność maven, która musi być tylko w zakresie testowym. Mamy dwie strony: co wolisz? ** Pierwsza strona **: używaj frameworku, jako zależności tylko w zakresie testowym, które musisz pobrać, że zaćmienie pozwala ci używać go w klasach, które nie znajdują się w folderze src/main, ale nie skompiluj go, ponieważ maven ma junit tylko w zakresie testowym lub ** Druga strona **: Używaj rzeczy wbudowanych. –

5

Powiedziałbym wykorzystanie JUnit twierdzi w przypadkach testowych i użyj assert javy w kodzie. Innymi słowy, rzeczywisty kod nigdy nie będzie miał zależności JUnit, jak oczywiste, a jeśli jest to test, powinien używać wariantów JUnita, nigdy nie twierdzić.