====== Unit Tests ======
===== Definitionen =====
**Unit tests** \\
Bei einem **unit test** (auf deutsch: "Modultest" oder "Komponententest") werden einzelne, abgrenzbare Teile (i.d.R. einzelne Methoden) eines Programms überprüft. Ziel des unit tests ist es, die Lauffähigkeit und die Korrektheit dieser Teile zu überprüfen. Unit tests werden meist von den Entwickler/-innen der Software durchgeführt.\\ \\
**Automatisierte unit tests** \\
Oft werden unit tests automatisiert durchgeführt, z.B. mit Hilfe von Test-Frameworks wie JUnit. Automatisierte tests haben den Vorteil, dass sie schnell und kostengünstig immer wieder durchgeführt werden können, wenn Änderungen am Programm vorgenommen wurden. \\ \\
**Test driven development** \\
Beim **test driven development** schreibt man ausgehend von einer Anforderung einen unit tests der Überprüft, ob das Programm dieser Anforderung genügt. Dann erst wird das Programm so erweitert/verändert, dass der Test erfolgreich durchläuft.
===== JUnit =====
**JUnit** ist das am weitesten verbreitete Test-Framework für Java. Meist wird es zusammen mit einem **test runner** in der Entwicklungsumgebung verwendet, der das aktuelle Projekt automatisiert nach JUnit-Tests absucht, die gefundenen Tests übersichtlich anzeigt und das Starten der Tests ermöglicht. Nachdem die Tests ausgeführt wurden, stellt der test runner die Ergebnisse übersichtlich dar. \\ \\
**Schreiben von JUnit-Tests** \\
JUnit-Tests sind Testmethoden innerhalb von Test-Klassen. Diese müssen folgenden Vorgaben genügen:
* Die **Testklasse** muss einen **parameterlosen Konstruktor** besitzen und kann mit ''@Test'' annotiert sein.
* Jede **Testmethode** innerhalb der Testklasse muss
* **parameterlos** sein,
* **void** zurückliefern und
* mit ''@Test'' annotiert sein.
Innerhalt der Test-Methoden kann man durch sogenannte **assertions** dem test runner mitteilen, ob ein Test erfolgreich war ("test passed") oder gescheitert ist ("test failed"). Assertions sind ganz einfach Aufrufe folgender globaler Methoden:
assertEquals(expected, actual, String errorMessage) // prints errorMessage if expected != actual
assertTrue(boolean condition, String errorMessage) // prints errorMessage if condition != false
assertFalse(boolean condition, String errorMessage) // prints errorMessage if condition != true
fail(String errorMessage) // prints errorMessage (place this at a location that must'nt be reached)
assertCodeReached(String errorMessage) // prints errorMessage if NOT CALLED (place this at a location that must be reached before program end)
Die letzte dieser Methoden (''assertCodeReached'') ist nicht Bestandteil von JUnit, sondern eine Spezialität der Online-IDE.
===== Beispiel =====
Das folgende Programm besteht aus einer Klasse ''MathHelper'', deren Methoden getestet werden sollen, und einer Klasse ''MathHelperTest'' mit automatisierten JUnit-Tests dazu. Öffnen Sie im unteren Teil des Programmfensters den Reiter "Testrunner" und klicken Sie auf die grünen Dreickspfeile vor den Tests, um sie auszuführen. \\ \\
//Tipp:// \\
Falls ein Testlauf gescheitert ist und Sie den Fehler suchen, setzen Sie einfach einen Breakpoint im Programm und lassen Sie den Test erneut laufen. Der Testlauf hält dann bei Ihrem Breakpoint an, so dass Sie bequem den Debugger zur Fehlersuche nutzen können.