Testen mit ScalaTest

Für Scala gibt es gerade im Bereich Testing einige interessante und mächtige, gleichzeitig einfach zu benutzende Bibliotheken. ScalaTest ist eine davon – sie verspricht mehr Produktivität bei weniger Lines of Code. Grund genug, das Framework einmal näher zu betrachten.

vorlesen Druckansicht
Lesezeit: 17 Min.
Von
  • Jens Schauder
Inhaltsverzeichnis

Für Scala gibt es gerade im Bereich Testing einige interessante und mächtige, gleichzeitig einfach zu benutzende Bibliotheken. ScalaTest ist eine davon – sie verspricht mehr Produktivität bei weniger Lines of Code. Grund genug, das Framework einmal näher zu betrachten.

Scala ist eine der aufstrebenden Sprache für die Java Virtual Machine (JVM). Sie hat ein leistungsfähiges Typsystem, eine kompakte Syntax und unterstützt sowohl einen funktionalen als auch einen objektorientierten Ansatz der Softwareentwicklung. Da Scala sich auch gut mit anderem Code, der auf der JVM ausgeführt wird, kombinieren lässt, eignet sich die Sprache besonders, um bestimmte Teilaspekte eines Softwareprojekts in Scala zu implementieren, ohne dass das Änderungen an anderen Teilen der Anwendung notwendig macht.

Besonders prädestiniert dafür sind automatisierte Tests. Sie werden nur in der Entwicklungs- und Testumgebung ausgeführt, und das Risiko beim Einsatz einer neue Sprache ist überschaubar. Man gewinnt hierbei ein Gefühl für die Sprache und merkt schnell, wie sie sich in die Softwareentwicklung integriert. Hinzu kommt, dass Tests kleine, unabhängige Einheiten bilden. Der Einsatz neuer Sprachen oder Bibliotheken wird daher kaum Auswirkungen auf den Rest des Projekts haben. Mit einer Ausnahme: So mancher Entwickler hat davon berichtet, dass er keine rechte Lust mehr auf Java hat, nachdem er ein wenig mit Scala experimentierte.

Das Framework ScalaTest offeriert viele Arten, Tests zu schreiben. Welchen Stil man benutzen möchte, gibt man durch einen Trait an, von dem die Testklasse erbt. Einen Trait kann man sich als ein Interface vorstellen, das seine Implementierung mitbringt. Im folgenden Beispiel fiel die Entscheidung auf FunSuite, da deren Tests vom Aufbau her ähnlich wie JUnit-Tests sind, aber die besonderen Fähigkeiten von Scala und ScalaTest offensichtlich werden lassen.

import org.scalatest.FunSuite

class EinfacherTest extends FunSuite {
test("the word 'test' has length 4") {
assert("test".length == 4)
}
}

In JUnit 3 erbte jede Testklasse von einer durch JUnit vorgegebenen Superklasse. Das schränkte Entwickler beim Entwurf von Tests unangenehm ein, daher wurde das Vorgehen in JUnit 4 abgeschafft. Das Erben von Traits in Scala hat die Probleme jedoch nicht, da man von beliebig vielen Traits erben kann. Der eigentliche Test wird in JUnit durch eine Methode definiert, zum Beispiel mit public void testSomething() { ... }.

Leider ist der Testname dabei der Name der Methode, was zu extrem langen, nur schlecht lesbaren Namen wie "testThatAStackThrowsAnEmptyStackExceptionOnPop" fĂĽhrt. In einer FunSuite wie der obigen ist der Test jedoch ein Aufruf der Methode test. Diese erwartet zwei Argumente: Einen String als Namen des Tests (im Beispiel "the word 'test' has length 4") und einen Code-Block (im Beispiel {assert("test".length == 4)} ) als eigentlichen Test. Da er im Body der ansonsten leeren Klasse steht, ist der Aufruf Teil des Konstruktors.

Beim Ausführen instantiiert ScalaTest die Testklassen. Im Konstruktor wird die test-Methode aufgerufen. Das registriert die im zweiten Parameter übergebenen Codeblöcke unter dem als ersten Argument übergebenen String als auszuführende Tests. Anschließend führt ScalaTest die gesammelten Codeblöcke aus und berichtet über die Ergebnisse.

FĂĽr diese EinfĂĽhrung ist die Beschreibung vereinfacht und im strikten Sinne falsch, jedoch fĂĽr den Artikel ausreichend. Wer sich fĂĽr die volle Wahrheit interessiert, sei an die ScalaDoc-Seiten von ScalaTest verwiesen.

Da der Support für ScalaTest in IDEs noch auf sich warten lässt, muss man selbst ein wenig Hand anlegen, um Tests auch wirklich auszuführen. Der Entwickler kann ein externes Tool nehmen, wie SBT, das als Build-Tool für Scala-Projekte beliebt ist und ScalaTest automatisch ausführen kann. Oder er ruft ScalaTest explizit auf – es ist schließlich auch nur ein Scala-Programm – oder macht den ScalaTest zu einem JUnit-Test, wodurch er die IDE-Unterstützung von JUnit nutzen kann. Die letzten beiden Varianten stellt der Artikel im Folgenden näher vor.