Heute habe ich einen JUnit-Testfall mit einer Java-Behauptung anstelle der JUnit-Behauptungen gesehen. Gibt es signifikante Vor- oder Nachteile, die einer gegenüber der anderen vorzuziehen sind?
Heute habe ich einen JUnit-Testfall mit einer Java-Behauptung anstelle der JUnit-Behauptungen gesehen. Gibt es signifikante Vor- oder Nachteile, die einer gegenüber der anderen vorzuziehen sind?
Antworten:
In JUnit4 ist die Ausnahme (tatsächlich Fehler), die von einer JUnit-Zusicherung ausgelöst wird, dieselbe wie der Fehler, der vom Java- assert
Schlüsselwort (AssertionError) ausgelöst wird. Sie ist also genau dieselbe wie assertTrue
und abgesehen von der Stapelverfolgung, bei der Sie keinen Unterschied feststellen konnten.
Allerdings müssen Asserts in der JVM mit einem speziellen Flag ausgeführt werden, sodass viele Tests bestanden werden, nur weil jemand vergessen hat, das System mit diesem Flag zu konfigurieren, als die JUnit-Tests ausgeführt wurden - nicht gut.
Aus diesem Grund würde ich im Allgemeinen argumentieren, dass die Verwendung von JUnit assertTrue
die bessere Vorgehensweise ist, da sie garantiert, dass der Test ausgeführt wird, Konsistenz gewährleistet (Sie verwenden manchmal assertThat
oder andere Asserts, die kein Java-Schlüsselwort sind) und wenn das Verhalten von JUnit Asserts ist Sollte sich dies in Zukunft ändern (z. B. durch Einbinden in einen Filter oder eine andere zukünftige JUnit-Funktion), kann Ihr Code dies nutzen.
Der eigentliche Zweck des Assert-Schlüsselworts in Java besteht darin, es ohne Laufzeitstrafe deaktivieren zu können. Das gilt nicht für Unit-Tests.
Ich bevorzuge JUnit-Zusicherungen, da sie eine umfangreichere API bieten als die integrierte assert
Anweisung und, was noch wichtiger ist, nicht explizit aktiviert werden müssen, im Gegensatz dazu assert
, was das -ea
JVM-Argument erfordert .
-ea
ist immer aktiviert in mvn test
, keine Notwendigkeit für -ea
. Reichere API, guter Fang. Manchmal denke ich, dass API im Test missbraucht wird, weil sie nicht Teil der Anwendung ist (a in api). Ich ziehe es vor, sie nur als umfangreichere Methoden zu bezeichnen.
Wenn ein Test fehlschlägt, erhalten Sie mehr Informationen.
assertEquals(1, 2);
führt zu java.lang.AssertionError: expected:<1> but was:<2>
vs.
assert(1 == 2);
führt zu java.lang.AssertionError
Sie können noch mehr Informationen erhalten, wenn Sie das Nachrichtenargument hinzufügen assertEquals
assert 1==2: "1 is not 2";
.
assert
möglicherweise vorzuziehen ist - für Korrektheitsprüfungen, die sich auf die Leistung auswirken und daher am besten standardmäßig deaktiviert werden. Ich habe jedoch die Erfahrung gemacht, dass die meisten Behauptungen immer gültig sein sollten.
Ich würde sagen, verwenden Sie JUnit-Asserts in Testfällen und Java's Assert im Code. Mit anderen Worten, realer Code darf niemals JUnit-Abhängigkeiten aufweisen, wie offensichtlich, und wenn es sich um einen Test handelt, sollte er die JUnit-Variationen verwenden, niemals die Behauptung.
Ich würde sagen, wenn Sie JUnit verwenden, sollten Sie die JUnit-Zusicherungen verwenden. assertTrue()
ist im Grunde das gleiche wie assert
, sonst warum überhaupt JUnit verwenden?
Assert
würde mehr Boilerplate erfordern. assert
Ohne JUnit müssten Sie ein ganzes Framework schreiben.
Dies gilt möglicherweise nicht, wenn Sie ausschließlich glänzende und neue Inhalte verwenden, aber assert wurde erst in 1.4SE in Java eingeführt. Wenn Sie in einer Umgebung mit älterer Technologie arbeiten müssen, können Sie sich aus Kompatibilitätsgründen an JUnit wenden.