Advanced Java Services | JUnit in Eclipse |
Ein JUnit-Test testet Methoden und Konstruktoren einer Klasse. JUnit-Tests sind
bereits in Eclipse integriert. Dazu greift Eclipse auf die Datei junit.jar zu.
JUnit erzeugt eine eigene Klasse mit leeren Testmethoden. Den Code zu diesen
Methoden muß man natürlich selbst entwerfen. In den von JUnit angelegten
Testmethoden ruft man dann die zu testende Methode mit bestimmten Parametern auf.
Zu bestimmten Parametern sollte die Methode ein bestimmtes Ergebnis liefern. Mit Hilfe von
Assertions vergleicht man das erwartete Ergebnis mit dem tatsächlichen Ergebnis.
Für diesen Vergleich stehen in der Klasse org.junit.Assert statische Methoden
zur Verfügung, mit denen man sehr differenzierte Vergleiche für verschiedene Situationen anstellen kann.
Hier einige der einfachsten Assertions:
Methode | Bedeutung |
---|---|
assertFalse(boolean condition) | Asserts that a condition is false. |
assertTrue(boolean condition) | Asserts that a condition is true. |
assertNotNull(Object object) | Asserts that an object isn't null. |
assertNull(Object object) | Asserts that an object is null. |
assertEquals(Object expected, Object actual) | Asserts that two objects are equal. |
Alle Methoden gibt es in zwei Varianten, die zweite Fassung ergänzt die erste um den Parameter String message als ersten Parameter.
Methode | Bedeutung |
---|---|
assertFalse(String message, boolean condition) | Asserts that a condition is false. |
assertTrue(String message, boolean condition) | Asserts that a condition is true. |
assertNotNull(String message, Object object) | Asserts that an object isn't null. |
assertNull(String message, Object object) | Asserts that an object is null. |
assertEquals(String message, Object expected, Object actual) | Asserts that two objects are equal. |
JUnit ist (natürlich) in Java geschrieben und daher kennt man den Aufbau der API. Leider ist die API in zwei Teile aufgeteilt.
Die ältere 3.8 API findet man unter JUnit3.8.1 APIDOC
Die neuere 4.x API findet man unter JUnit 4.x APIDOC
Ein JUnit Tast Case wird immer zu einem bestehendem Projekt angelegt. Als Beispiel gehen wir von einer Klasse Wochentag aus. Diese enthält eine statischen Methode getWochentag(int tag, int monat, in jahr), die nach einer alten (aber nicht veralteten) Formel von Gauß zu einem übergebenen Datum den Wochentag liefert.
public class Wochentag { public static String getWochentag(int tag, int monat, int jahr) { int wochentag; int h = monat, k = jahr ; if (monat < 3) { h = monat + 12 ; k = jahr-1 ; } //wochentag = (tag+2*h + (3*h+3)/5 + k + k/4 - k/100 + k/400 + 1)%7 ; // richtige Formel // Vorzeichenfehler in der Formel: wochentag = (tag+2*h + (3*h+3)/5 + k + k/4 + k/100 - k/400 + 1)%7 ; switch (wochentag) { case 0 : return "Sonntag"; case 1 : return "Montag"; case 2 : return "Dienstag"; case 3 : return "Mittwoch"; case 4 : return "Donnerstag"; case 5 : return "Freitag"; case 6 : return "Samstag"; default: return "gibts nicht"; } } } // end class
In diese Formel hat sich ein Vorzeichenfehler eingeschlichen. Wir legen nun ein Test Case an.
Je nach Eclipseversion: Projekt (oder Javadatei) markieren -> rechte Maustaste (Kontextmenu) -> New -> JUnit Test Case oder Projekt (oder Javadatei) markieren -> rechte Maustaste (Kontextmenu) -> New -> Other ->JUnit Test Case
Wir geben der von JUnit zu erzeugenden Datei den Namen der Klasse, in der die zu testende Methode liegt und hängen an den Namen das Wort Test an.
Im folgenden Dialog wird auch noch angeboten ob die zu erzeugende Testmethode final angelegt werden soll. Auf die sonst noch angebotenen vier Methoden verzichten wir in diesem einfachen Beispiel.
Eclipse fügt für uns die notwendigen Bibliotheken ein und JUnit erzeugt uns eine Klasse WochentagTest mit einer von uns zu füllenden Testmethode:
import static org.junit.Assert.*; import org.junit.Test; public class WochentagTest { @Test public /* final */ void testGetWochentag() { fail("Not yet implemented"); // TODO } }
Wir schreiben einen Testfall und benützen dazu assertEquals.
public class WochentagTest { @Test public void testGetWochentag() { // sollte Donnerstag sein String tag = Wochentag.getWochentag(31, 03, 2016); assertEquals("Donnerstag", tag); } }
Es gibt kleine Varianten um den Test zu starten. Hier eine Variante.
Das Ergebnis wird als Fenster neben dem Konsolfenster angezeigt.
Der Meldung von JUnit kann man entnehmen, daß die Methode nicht den zu erwartetenden Wochentag "Donnerstag" zurückgibt.