Vergleich Assertion Bibliotheken in Java
Wer Tests schreibt, sollte zwangsläufig auch Assertions verwenden. Bevor man Assertions verwenden kann, sollte man aber natürlich eine geeignete Assertionsbibliothek auswählen. Dieser Artikel vergleicht fünf der populärsten Bibliotheken: JUnit Assert, TestNG Assert, AssertJ, Hamcrest und Truth.
Junit
JUnit Assert ist Teil des JUnit-Frameworks und bietet eine gute Basis an Prüfungsmethoden. Da JUnit bereits in den meisten Projekten eingebunden ist, benötigt es zur Verwendung der Assertions keine zusätzliche Bibliothek. Es ist einfach zu verwenden und bietet eine Vielzahl von Methoden zum Vergleichen von Objekten, einschließlich assertEquals, assertNotEquals, assertArrayEquals und assertTrue.
Beispiele bei der Verwendung von Junit:
assertEquals(expected, actual) assertTrue(condition) assertFalse(condition) assertNull(object) assertNotNull(object) assertArrayEquals(expectedArray, actualArray) assertSame(expected, actual) assertNotSame(expected, actual) //ab Junit 5 assertThrows(ExpectedException.class, () -> { /* Code, der die erwartete Ausnahme auslöst */ })
TestNG
Bei der Verwendung von TestNg für die Organisation von Tests hat man wie bei Junit Asserts den Vorteil, dass die TestNG Asserts „out of the box“ verfügbar sind. TestNG Assert ist Teil des TestNG Frameworks und bietet ähnliche Methoden wie JUnit Assert. Ein Beispiel für die Verwendung von TestNG Assert ist assertEquals(expected, actual).
Beispiele für Verwendung von TestNG Assertions:
Assert.assertEquals(expected, actual) Assert.assertTrue(condition) Assert.assertFalse(condition) Assert.assertNull(object) Assert.assertNotNull(object) Assert.assertEquals(expectedArray, actualArray) Assert.assertSame(expected, actual) Assert.assertNotSame(expected, actual)
Hier auch ein Beispiel für die assertThrows Methode
@Test public void testDivideByZero() { Calculator calculator = new Calculator(); Assert.assertThrows(ArithmeticException.class, () -> { calculator.divide(10, 0); }); }
Hamcrest
Hamcrest ist ein externes Assertion-Framework, das eine Vielzahl von Matcher-Klassen und -Methoden anbietet, die zum Vergleich von Objekten verwendet werden können. Es bietet eine große Auswahl an Methoden zum Vergleichen von Objekten, einschließlich equalTo, containsString und greaterThan. Hamcrest kann auch mit anderen Assertion-Bibliotheken wie JUnit Assert und TestNG Assert verwendet werden. Ein Beispiel für die Verwendung von Hamcrest ist assertThat(actual, equalTo(expected)).
assertThat(actual, equalTo(expected)) assertThat(actual, greaterThan(expected)) assertThat(actual, lessThan(expected)) assertThat(actual, between(start, end)) assertThat(actual, containsString(expected)) assertThat(list, hasSize(expectedSize)) assertThat(object, instanceOf(ExpectedClass.class))
AssertJ
AssertJ ist ein leistungsstarkes Assertion Framework, das eine leicht lesbare und „fluente“ API bietet. Es bietet eine Vielzahl von Methoden zum Vergleichen von Objekten, einschließlich isEqualTo, isNotEqualTo, containsOnly und hasSize. AssertJ verwendet auch Typ-Inferenz, um die Lesbarkeit des Codes zu verbessern. Ein Beispiel für die Verwendung von AssertJ ist assertThat(actual).isEqualTo(expected).
assertThat(actual).isEqualTo(expected) assertThat(actual).isGreaterThan(expected) assertThat(actual).isLessThan(expected) assertThat(actual).isBetween(start, end) assertThat(actual).contains(expected) assertThat(list).hasSize(expectedSize) assertThat(object).isInstanceOf(ExpectedClass.class)
Truth
Truth ist ein von Google entwickeltes Assertion Framework. Es bietet eine einfache, leicht verständliche Syntax und eine Vielzahl von Methoden zum Vergleichen von Objekten, einschließlich isEqualTo, isNotEqualTo und containsExactly. Truth verwendet auch eine eigene Fehlermeldung, die dem Entwickler hilft, Fehler schneller zu identifizieren. Ein Beispiel für die Verwendung von Truth ist assertThat(actual).isEqualTo(expected).
assertThat(actual).isEqualTo(expected) assertThat(actual).isGreaterThan(expected) assertThat(actual).isLessThan(expected) assertThat(aUser).isIn(Arrays.asList(1, 3, aUser, null)) assertThat(actual).contains(expected) assertThat(list).hasSize(expectedSize) assertThat(object).isInstanceOf(ExpectedClass.class)
API Referenzen
JUnit Assert | https://junit.org/junit4/javadoc/latest/index.html |
TestNG Assert | https://javadoc.io/doc/org.testng/testng/latest/index.html |
AssertJ | https://assertj.github.io/doc/ |
Hamcrest | http://hamcrest.org/JavaHamcrest/javadoc/2.2/ |
Truth | https://truth.dev/api/ |
Fazit
Zusammenfassend kann gesagt werden, dass alle fünf vorgestellten Assertionsbibliotheken ausreichende Methoden zur Konstruktion von Assertionen in Testfällen bieten. Die Wahl der richtigen Bibliothek hängt von den spezifischen Anforderungen und den eigenen Präferenzen ab.
JUnit Assert und TestNG Assert sind einfach zu bedienen, kommen „out of the box“ mit den Testrunnern und bieten eine für die meisten Projekte ausreichende Anzahl von Methoden zum Vergleich von Soll-/Ist-Werten.
Hamcrest bietet die größte Anzahl an Matcher Klassen und Methoden, die sehr nützlich sein können, wenn spezifischere Tests erstellt werden müssen.
AssertJ bietet eine einfach zu verwendende, „flüssige“ API und verwendet Typ-Inferenz, um die Lesbarkeit zu verbessern.
Truth bietet eine einfache, leicht verständliche Syntax und ist vom Umfang der Assertionsmethoden mit AssertJ vergleichbar.
Insgesamt sind alle vorgestellten Bibliotheken empfehlenswert und bieten eine solide Basis, um effektive Tests zu schreiben.
Ich persönlich würde mich derzeit für AssertJ oder Google Truth entscheiden.
Begeisterter Entwickler, Trainer und Berater zu allem Themen rund um agile Softwareentwicklung, Softwarequalität und Testautomatisierung.
Gründer und Geschäftsführer der Firma SimplyTest GmbH
Hallo Waldemar,
leider finde ich, dass der Artikel etwas dünn und nicht gut recherchiert ist. Auch JUnit 5 beinhaltet ein assertThrows, was du bei TestNG besonders hervorhebst. Zusätzlich betonst du die große Anzahl an Matchern in Hamcrest, was zwar richtig ist, aber außer acht lässt, das Hamcrest seit langer Zeit keinen ernsthaften Commit mehr hatte und nicht aktiv weiterentwickelt wird, ganz im Gegensatz zu AssertJ und Truth. Daher würde ich im Gegensatz zu dir momentan immer von Hamcrest abraten.
Bei deiner persönlichen Empfehlung würde ich grundsätzlich zustimmen, wobei ich eher zu AssertJ tendieren würde, da diese Lib wesentlich bekannter ist.
Gruß
Andrej
Hallo Andrej, vielen Dank für dein Feedback. Der Artikel war als Übersicht kurz neben der Projektarbeit zusammengeschrieben, ich werde deinen Input gerne ergänzen.
Zu den Punkten:
1. assertThrows in JUnit 5 hast du natürlich Recht, meine Bewertung bezog sich eher auf JUnit 4, da noch einige Projekte diese Bibliothek verwenden.
2. Hamcrest wird tatsächlich nur bedingt weiterentwickelt, aber das ist für mich per se kein Ausschlusskriterium, wenn die Bibliothek gut funktioniert.
Aber es freut mich sehr, dass du mit meiner Empfehlung übereinstimmst. Es ist immer schön Feedback zu bekommen!
Danke dir und viele Grüße,
Waldemar