Google Truth erscheint nach acht Jahren Entwicklung in Version 1.0

Die erste Hauptversion der Library zum Erstellen aussagekräftiger Assertions für Java markiert endlich eine stabile API.

In Pocket speichern vorlesen Druckansicht 7 Kommentare lesen
Testing: Google Truth erreicht nach acht Jahren erste Hauptversion
Lesezeit: 3 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Google hat die Library Truth in Version 1.0 veröffentlicht. Entwickler können mit Truth Assertions erstellen, die dem Prinzip der Fluent Interfaces folgen. Die Bibliothek ist auf Java und Android ausgelegt, und in Kürze sollen spezifische Erweiterungen für Kotlin folgen. Die Entwicklung der Bibliothek geht ins Jahr 2011 zurück, und das 1.0-Release markiert nun eine stabile API.

Mit Assertions testen Softwareentwickler, dass Teile des Programms einen bestimmten Zustand haben, also beispielsweise Variablen den erwarteten Wert aufweisen oder nicht null sind. Testframeworks wie JUnit bieten Assertions in unterschiedlichen Varianten wie assertEquals und assertTrue. Truth setzt dagegen auf den einheitlichen Befehl assertThat.

Damit sollen sich Assertions zum einen einfacher erstellen lassen und zum anderen aussagekräftigere Meldungen ausgeben. Als Beispiel vergleicht die Site zu Truth folgenden JUnit-Test

assertEquals(
ImmutableMultiset.of("guava", "dagger", "truth",
"auto", "caliper"),
HashMultiset.create(projectsByTeam().get("corelibs")));

mit der Umsetzung derselben Zusicherung in Truth:

assertThat(projectsByTeam())
.valuesForKey("corelibs")
.containsExactly("guava", "dagger", "truth", "auto", "caliper");

Letzterer ist übersichtlicher und ermöglicht zudem eine Autovervollständigung im Editor. Truth spielt seinen Vorteil dabei aber vor allem bei der Ausgabe aus, wenn beispielsweise bei dem zu testenden Objekt, das übrigens die Projekte des Teams hinter Truth aufführt, der Wert "truth" fehlt. JUnit zeigt in dem Fall folgende Meldung

java.lang.AssertionError: \
expected:<[guava, dagger, truth, auto, caliper]> \
but was:<[dagger, auto, caliper, guava]>
at org.junit.Assert.failNotEquals(Assert.java:835) \
<2 internal calls>
at com.google.common.truth.example.DemoTest.testBuiltin\
(DemoTest.java:64) <19 internal calls>

während die Ausgabe von Truth explizit auf das fehlende truth hinweist und einen Vergleich des erwarteten und tatsächlichen Objekts anzeigt:

value of    : projectsByTeam().valuesForKey(corelibs)
missing (1) : truth
---
expected : [guava, dagger, truth, auto, caliper]
but was : [guava, auto, dagger, caliper]
multimap was: {corelibs=[guava, auto, dagger, caliper]}
at com.google.common.truth.example.DemoTest.testTruth\
(DemoTest.java:71)

Truth setzt auf das Design Pattern Fluent Interface, das im Deutschen gelegentlich auch sprechende Schnittstelle heißt, was der Arbeitsweise näher kommt. Das Prinzip, das unter anderem auf Martin Fowler zurückgeht, dient vor allem der besseren Lesbarkeit der APIs beziehungsweise des Quellcodes.

Truth steht mit dem Ansatz nicht alleine da, und das Team führt das ebenfalls dem Fluent-Interface-Design-Pattern folgenden AssertJ als sehr ähnliche konzipierte Library auf. Die Anfänge von Truth liegen aber vor denen von AssertJ und es sei einfacher gewesen Truth weiterzuentwickeln, als die Tests innerhalb der internen Codebasis von Google umzustellen. Java Hamcrest sei deutlich anders konzipiert und zudem nicht nur auf Assertions ausgelegt.

Ursprünglich hatte ein Google-Entwickler Truth als privates Open-Source-Projekt gestartet. Er hat es Google übergeben, und inzwischen hat das Team hinter den bei Google entwickelten Java-Core-Libraries die Hauptverantwortung übernommen.

Das Test-Framework AndroidX Test bietet erweiterte Klassen, die den Einsatz von Assertions mit Truth weiter vereinfachen sollen. Ein Issue auf GitHub beschäftigt sich zudem mit der Erweiterung von Truth für den Einsatz mit Kotlin.

Weitere Details zur Veröffentlichung von Truth 1.0 lassen sich dem Google-Open-Source-Blog entnehmen. Eine Übersicht und Dokumentation bietet die Projekt-Site. Der Sourcecode ist auf GitHub zu finden. (rme)