© Excellent backgrounds/Shutterstock.com
Teil 1: Grundlagen, Vergleich mit JUnit

Mit Mr. Spock beim Testeinsatz


Spock ist in der Java-Gemeinde unberechtigterweise wenig bekannt. Aus diesem Grund ist es höchste Zeit, das Testframework hier zu beleuchten und zu zeigen, wie einfach und übersichtlich damit an das Thema Testing herangegangen werden kann.

Was spricht, kurz zusammengefasst, für den Einsatz von Spock als Testframework? Durch die übersichtliche Syntax lassen sich schnell benutzerfreundliche Tests schreiben. Des Weiteren wird in Spock versucht, Boilerplate-Code zu vermeiden, wodurch mit verhältnismäßig wenig Aufwand ein umfassendes Spektrum getestet werden kann. Obwohl Spock einfach erlernbar ist, bietet es bei Bedarf die Flexibilität, eigene Erweiterungen einzubauen, z. B. für das Reporting.

Spock bietet Unterstützung für Unit, Integrations- sowie funktionale Tests. Für funktionale Tests eignet sich insbesondere die Kombination von Spock [1] und Geb [2], auf die im nächsten Artikel dieser Serie eingegangen wird.

Groovy als Basis

Fundament von Spock ist die dynamische Programmiersprache Groovy [3]. Eine der Stärken Groovys ist die Möglichkeit der einfachen Erstellung von Domain-specific Languages (DSL). Das Spock-Framework nutzt eine eigene DSL, die auf die Bedürfnisse des Testens zugeschnitten ist und deren Syntax in diesem Artikel erläutert wird.

Da Groovy auf der JVM basiert, kann Spock natürlich ebenso Java-Code ausführen. Das bedeutet, Spock-Tests können zum einen selbst Java-Code enthalten oder auf die vielen nützlichen Bibliotheken der Java-Welt zurückgreifen. Zum anderen lassen sich aufgrund der JVM-Nähe Java-Anwendungen testen. Das ebenfalls auf Groovy aufbauende Webframework Grails setzt ab der Version 2.3 auf Spock als Standardtestframework.

Spock steht unter der Apache-Lizenz 2.0 und ist damit frei verfügbar. Da es keine schwerwiegenden Probleme gibt, ist das letzte freigegebene Release schon ca. zwei Jahre alt. Der Master Branch auf GitHub [4] ist relativ stabil und kann problemlos zum Einsatz kommen, wenn die neuesten Features bzw. Bugfixes benötigt werden.

Einfacher Einstieg

Wer Spock zunächst ausprobieren möchte, dem sei die auf der Google-App-Engine laufende Spock Web Console [5] empfohlen. Hier kann über die Weboberfläche Spock-Code eingegeben und direkt ausgeführt werden.

Ansonsten beginnt der Einstieg durch Inkludierung der Abhängigkeit zu Spock sowie Groovy über das jeweilige Build-Werkzeug im zu testenden Projekt. Beim Einsatz von Gradle ist die Abhängigkeit in build.gradle wie folgt zu definieren:

testCompile "org.codehaus.groovy:groovy-all:2.3.6" testCompile "org.spockframework:spock-core:0.7-groovy-2.0"

Die gängigen Java-Entwicklungsumgebungen bieten Unterstützung für Groovy. Dadurch können ebenso Spock-Testcases behandelt werden. Des Weiteren existieren jeweils frei verfügbare Plug-ins für ein komfortables Highlighting der Spock-Syntax. Besonders gut ist die Integration mit IntelliJ beim Anzeigen der ausgeführten Testfälle gelungen, wie später noch gezeigt wird. Zur ersten Veranschaulichung der Syntax dient folgender trivialer Testfall:

class SimpleMathSpec extends Specification { def "Mathematik einfach gemacht"() { expect: 1 + 3 == 4 6 == 2 * 3 } }

Jede Testklasse in Spock erbt von der Oberklasse Specification und kann analog zu JUnit mehrere auszuführende Methoden enthalten. Der Name einer so genannten Feature-Methode ist generell ein natürlicher Beschreibungstext des Testfalls. Dadurch erkennt der Betrachter ohne Umschweife, was die Aufgabe des Tests ist, und es sind in der Regel keine weiteren Kommentare zur Beschreibung der Methode notwendig. Insbesondere beim Ausführen vieler Testfälle, wie bspw. bei automatisierten Tests in größeren Projekten, ist eine natürliche Beschreibung der Featuremethoden sehr hilfreich.

Das Schlüsselwort expect kennzeichnet in unserem Beispiel einen Block. Jede Zeile innerhalb des expect-Blocks wird ausgewertet. Eine Zeile kann hier wie eine Assertion gesehen werden, die auf Boolean überprüft. Sobald eine Bedingung nicht erfüllt ist, schlägt die Testmethode fehl und wird abgebrochen.

Übersichtliche Struktur

In Spock sind Testmethoden generell nach dem Schema „Gegeben-Wenn-Dann“ aufgebaut. Dies wird durch die verschiedenen Blocktypen deutlich visualisiert. Es stehen die folgenden sieben Blöcke zur Verfügung: setup, when, then, expect, where, and, cleanup.

Die Blöcke setup und cleanup werden vor bzw. nach dem Ausführen der Testmethode aufgerufen. Mit setup wird die Bearbeitung vorbereitet, z. B. durch Initialisieren von Variablen oder Klassen. Aufräumaktionen wie das Löschen von angelegten DB-Inhalten können in der cleanup-Sektion vorgenommen werden. Generell sind die einzelnen Blöcke, wie schon im ersten Beispiel zu sehen ist, optional.

Im when-Block werden die eigentlichen zu testenden Artefakte ausgeführt. Dies kann gegebenenfalls der Aufruf einer Servicemethode oder die Ausführung sonstiger Logik sein. Für jeden when-Block muss auch immer ein then-Block implementiert werden. Dort erfolgt die Überprüfung der Bedingungen. Analog zum expect-Block enthält jede Zeile eine Bedingung, die für einen erfolgreichen Testfall erfüllt sein muss. Im Gegensatz zum then-Block steht der expect-Block alleine. Mit der where-Sektion ist eine Parametrierung der Testmethoden möglich, sodass diese mehrfach durc...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang