TDD - Test Driven Development
Der Begriff TDD umfasst ein weites Feld. Ich werde hier den Schwerpunkt zu Beginn auf die Verwendung von jUNit legen. jUnit ist seit recht langer Zeit frei verfügbares Framework zu Erstellung und Durchführung von Tests. Der Grundgedanke ist recht einfach. Es werden für möglichst kleine Quelltextabschnitte bzw Methoden Tests geschrieben, die reproduzierbar sind. Damit kann man diese in eine Ablaufumgebung wiederholt durchführen und eine Veränderung im Verhalten erkennen. Um das Verhalten auf seine definierte Korrektheit hin zu überprüfen wird der Test mit den dafür notwendigen Prüfungen versehen. Der Aufbau komplexer Prüfungen erfolgt durch die Kombination einfacher Grundoperatoren.
Beginnen wir mit einem Beispiel.
public class HelloWorldService {
public String sayHello() {
return "hello";
}
}
Die Funktionsweise ist trivial, soll dennoch automatisch getestet werden. Hierzu definieren wir zunächst in dem Projekt die Abhängigkeiten zu dem TestFramework. Wird maven verwendet, so kann in der pom.xml folgendes hinzugefügt werden.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Da nun der Zugriff auf die Klassen von jUNit besteht, beginnen wir mit der Implementierung
der ersten Tests. Damit sichergestellt wird, das die Testimplementierungen nicht in den
Produktionsquellen enthalten sind, werden die Tests in den dafür vorgesehenen Verzeichnissen abgelegt.
Bei Maven ist das unter src/test/java
Die Implementierung selbst ist recht einfach und muss nur wenigen grundsätzlichen Anforderungen genügen.
@Test
public void test001() throws Exception {
final HelloWorldService service = new HelloWorldService();
final String hello = service.sayHello();
Assert.assertNotNull(hello);
Assert.assertEquals("hello", hello);
}
Der Test selbst wird genauso geschrieben, wie man den Service verwenden würde.
Dazu kommen dann die Überprüfungen der Ergebnisse. Es werden hier zwei Tests in einer Testmethode
definiert. Der erste Test überprüft, ob ein Ergebnis ungleich null geliefert worden ist. Der zweite
Tests vergleicht den Inhalt der Antwort mit dem Inhalt der erwartet wird. Damit der Test ausgeführt werden kann,
ohne das eine main - Methode geschrieben werden muss, wird die Methode mit der Annotation
@Test
versehen. Das Framework selbst sucht nach Methoden mit dieser Annotation und führt diese
dann in einer nicht genau definierten Reihenfolge aus. Damit ist auch einer der wichtigsten Grundregeln
bei der Erstellung von jUNit-Tests ableitbar. Jeder Test muss für sich selbst lauffähig sein und darf
keine Annahmen darüber treffen welcher Test vorher und welcher Test nachfolgend ablaufen wird.