Name

Vergleich JUnit 3.8 mit JUnit 4.5

Homepage

http://www.junit.org
Download von SourceForge

Lizenz

Beide Versionen stehen unter der Common Public Licence (CPL)

Untersuchte Version

Verglichen werden die Versionen JUnit 3.8 und JUnit 4.5.

Letzter Untersuchungszeitpunkt

20.02.2009

Kurzbeschreibung

JUnit 3.8/ 4.5 wurde zum Testen von Java-Programmen entwickelt. Mit dem Tool lassen sich automatisierte Unit-Tests einzelner Klassen, Methoden oder Testsuiten durchführen. JUnit entscheidet bei seinen Tests zwei Ergebnisse, Test durchlaufen mit "Ok" (grün), Test abgebrochen (rot). Kenntnisse von JUnit3.x können hilfreich sein, da weitere Testwerkzeuge auf dieser JUnit-Version basieren und gegebenenfalls nicht aktualisiert werden, damit auch Java 1.4.x-Code testbar bleibt.

Fazit

Auf den ersten Blick fallen die Änderungen der Versionen nicht sofort ins Auge, schaut man jedoch etwas genauer hin, werden die neuen Features sichtbar und erweisen sich als sehr nützlich und hilfreich. JUnit bietet, egal in welcher Version, eine sehr gute Möglichkeit, Java-Programme zu testen. Das Werkzeug ist sehr mächtig und stellt umfangreiche Test- und Automatisierungsszenarien zur Verfügung. Die neue Version von JUnit 4.x nutzt erstmals Annotationen, die das Schreiben von Testfällen erleichtern, da Methodennamen frei und beliebig vergeben werden können. Zusätzlich wurden neue Testmethoden hinzugefügt, die das Testen von Programmen weiterhin erleichtern sollen. JUnit-Fehlermeldungen wurden dahingehend verbessert, dass die Möglichkeit besteht, eigene Fehlermeldungen zu schreiben. Jedoch stellt sich die Frage, ob man die Funktion wirklich braucht, da die Fehlermeldungen von JUnit sprechend und sehr gut sind.

Allgemein gilt für beide Versionen:
Für unerfahrene Nutzer ist es am Anfang eher schwierig, sich in die Testmechanismen einzuarbeiten. Da JUnit sehr verbreitet und oft genutzt wird, findet man gute und hilfreiche Literatur im Internet die das Einarbeiten sehr erleichtern.

Einsatzgebiete

Die Einsatzgebiete beider Versionen sind gleich gebliebenen, da die Version 3.8 lediglich verbessert wurde. JUnit wird im Java-Umfeld von Entwicklern genutzt, die das Innenleben einer Klasse kennen, um Unit-, Komponenten- und White-Box-Tests zu schreiben.

Einsatzumgebungen

PlugIn für Eclipse oder als Standalone Anwendung.

Installation

Zur Installation von JUnit muss das heruntergeladene Zip-File in einem beliebigen Ordner entpackt werden. In diesem Ordner befindet sich eine JAR-Datei (junit-4.5.jar), diese Datei muss in die Pfadvariable des Systems integriert werden.

Diese Schritte reichen aus, um JUnit auf einem System zu installieren. Um die Installation zu testen kann folgender Befehl in einer Konsole eingegeben werden [java org.junit.runner.JUnitCore org.junit.tests.AllTests]. Mit diesem Aufruf werden mitgelieferte JUnit-Tests ausgeführt, um zu zeigen, dass JUnit korrekt installiert wurde. Diese Tests sollten alle korrekt durchlaufen. Zusätzlich besteht die Möglichkeit, JUnit in Eclipse zu verwenden, wie JUnit in Eclipse genutzt werden kann, wird im nächsten Abschnitt beschrieben.


Einbinden in Eclipse:

Ein neues Java-Projekt erstellen oder ein schon bestehendes öffnen bzw. auswählen. Auf "Project" --> "Properties" klicken, "Java Build Path", "Libraries" auswählen, und auf "Add External JARs" klicken. Jetzt zu junit-4.5.jar navigieren und auswählen. "Okay" drücken. Anschließend kann eine neue JUnit-Testklasse erstellt werden.

Dokumentation

Im Ordner von JUnit befinden sich zwei weitere Ordner, die als Dokumentation von JUnit genutzt werden können. Im Ordner "javadoc" befindet sich die generierte Dokumentation aus den Quelldateien, die Hinweise über einzelne Klassen, Objekte und Methoden gibt. Im Ordner "doc" befinden sich weitere Ordner, die eine entsprechende Doku enthalten über FAQ, Cookbook und über den Aufbau von Tests. Weitere Informationen, Hinweise und Tipps befinden sich auf der Webseite von JUnit. Bei den Dokumentationen wurden für JUnit 4.5 lediglich die Neuerungen und Unterschiede in die entsprechenden Dateien eingebaut.

Wartung der Projektseite

Die Projektseite von JUnit ist sehr gut strukturiert und besitzt einen übersichtlichen Aufbau. Die Seite gewährt einen schnellen Einblick in die Funktionalität von JUnit. Die Webseite wird stetig weiterentwickelt und mit neuem Inhalt aktualisiert.

Nutzergruppen und Support

Eine Registrierung auf der Webseite ist möglich. Eine Mailinglist mit den Entwicklern ist auf der Seite integriert, mit Statusanzeige wer gerade online ist. Es besteht die Möglichkeit, einen beliebigen Entwickler direkt per E-Mail zu kontaktieren.

Intuitive Nutzbarkeit

Die Nutzbarkeit von JUnit ist sehr gut. Um einen neuen Unit-Test anzulegen, wird eine JUnit-TestClass ausgewählt. Hat man seinen Test geschrieben und lässt ihn laufen, wird in Eclipse ein JUnit-Fenster geöffnet in dem die Ergebnisse des Tests aufgelistet werden.

Automatisierung

Automatisierung über sogenannte Testsuiten die flexibel Mengen von Tests zusammenfassen könne. Eine Testzusammenfassung mit Hilfe von XML möglich.

Einführendes Beispiel

Als einführendes Beispiel werden verschiedene If-Bedingungen und Zahlenberechnungen getestet (Fakultät und Fibonacci Zahlen). Beim Anlegen der Testklassen in Eclipse hat sich von der Version 3.8 zu 4.5 nichts geändert. Der Aufbau der Testklassen hat sich hingegen verändert. Die Änderungen werden im letzten Abschnitt beschrieben.

JUnit3.8 Klassen:

JUnit4.5 Klassen:

Zuerst wird eine Methode benötigt die getestet werden soll. In diesem Beispiel wurde TestBeideWahr(); aus der Klasse WahrFalsch.java gewählt. Diese einfache Methode überprüft ob zwei Boolean-Werte "true" ergeben. Falls dies nicht der Fall ist wird eine Exception geworfen.

public class WahrFalsch {

	private String erg = "";

	public void TestBeideWahr(boolean a, boolean b) throws Exception{

		if(a && b){
			erg = "beide wahr";
			System.out.println("Beide Wahr");
		}
		else{
			erg = "nicht beide wahr";
			throw new Exception("Variablen nicht identisch");
		}

	}
	...

Um die Tests durchzuführen wird eine JUnit Klasse benötigt.

Anlegen einer neuen JUnit Test Klasse

Um die einzelnen Klassenmethoden testen zu können, müssen die dafür nötigen Objekte erzeugt werden. Die Methode public void setUp(); wird zu Anfang des Testlaufs automatisch ausgeführt und kann, unter anderem, verwendet werden um Variablen zu initialisieren oder eine Verbindung zu einer Datenbank aufzubauen.
Durch den automatischen Aufruf von public void tearDown(); am Ende jeden Testdurchlaufs, kann der Tester nicht mehr benötigte Ressourcen freigeben oder offene Datenbankverbindungen trennen.
Die Annotations "@Before" und "@After" aus JUnit 4.5 legen fest, ob die Methoden vor oder nach einem Testlauf ausgeführt werden sollen.

	/*Wird vor jedem Testaufruf ausgeführt*/
	@Before
	public void setUp() throws Exception {

		objWF = new WahrFalsch();
		objF = new Fakultaet();
		objFib = new Fibonacci();
	}

	/*Wird nach jedem Testaufruf ausgeführt*/
	@After
	public void tearDown() throws Exception {

	}

In JUnit 3.8 musste dagegen noch der Konstuktor der Überklasse aufgerufen werden.

protected void setUp() throws Exception {
		super.setUp();
		objWF = new WahrFalsch();
		objF = new Fakultaet();
		objFib = new Fibonacci();
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

Jeder Testfall muss in eine eigene Methode unterteilt werden. In JUnit 4.5 kennzeichnet die Annotation "@Test" die Methode als einen Testcase, wohingegen die Testcases in Version 3.8 den Präfix test besitzen mussten. So gekennzeichnete Methoden werden automatisch ausgeführt.
Wirft die zu testende Methode eine Exception schlägt der Test fehl.
Falls keine Exception geworfen wurde, vergleicht assertTrue(); den zu erwartenden Wert mit dem Rückgabewert der Methode objWF.getSring();. Sind beide Werte gleich, war der Test ein Erfolg, ansonsten schlägt dieser Fehl und die überprüfte Methode muss überarbeitet werden.

JUnit 3.8:

// Testet ob beide Variablen wahr sind
public void testWahrFalsch1(){
		String expected = "beide wahr";

		try{
			objWF.TestBeideWahr(true, true);
		}catch (Exception e) {
			fail("TestWahrFalsch1 fehlgeschlagen");
			e.printStackTrace();
		}

		assertEquals(expected, objWF.getString());
	}


JUnit 4.5:

	// Testet ob beide Variablen wahr sind
	@Test
	public void WahrFalsch1(){
		String expected = "beide wahr";

		try{
			objWF.TestBeideWahr(true, true);
		}catch (Exception e) {
			fail("TestWahrFalsch1 fehlgeschlagen");
			e.printStackTrace();
		}

		assertEquals(expected, objWF.getString());
	}

Alternativen zu assertEquals(); können hier gefunden werden.
Nachdem die Tests geschrieben wurden, klickt man rechts auf die Testklasse und wählt "Run As" --> "JUnit Test Case" aus:

Starten einer JUnit Testklasse


Wenn der Test durchgelaufen ist wird folgende Ansicht in Eclipse sichtbar und zeigt, ob der Test korrekt durchlaufen wurde oder nicht. Die Testfälle werden dementsprechend gekennzeichnet:

Ergebnis der Testläufe

Detaillierte Beschreibung

Siehe Hilfe von JUnit, FAQ und Cookbook.

Unterschiede im Überblick

Mit den Neuentwicklungen von JUnit 4.x wurde die Java Version 1.5 verwendet. JUnit4.x baut im Gegensatz zu JUnit 3.81 auf Annotationen auf, die ein neues Ausdrucksmittel in der Metaprogrammierung darstellen. In Java bzw. JUnit4.x werden die Annotationen durch ein "@" eingeleitet und dienen als Hilfsmittel, den Code mit frei wählbaren Anmerkungen zu versehen. JUnit4.x verwendet Annotationen, um Testfälle als solche zu markieren, dazu wird vor die Methode "@Test" geschrieben. In JUnit 3.8x müssen alle Methoden, die etwas mit einem Test zu tun haben mit "testXXXXX()" beginnen, damit sie in einen Test mit einbezogen werden.

import junit.framework.TestCase;

import org.junit.Test;
import static org.junit.Assert.*;


public class IntegrationsTest extends TestCase{

@Test
public void testWahrFalsch1(){

...
}


In obigem Beispiel kann man sehr schön erkennen, was sich zwischen den beiden Versionen grundsätzlich geändert hat. Die durchgestrichenen Programmteile waren für JUnit 3.8x notwendig, der fettgedruckte Programmcode ist nun für JUnit4.x. Mit der neuen Version von JUnit4.x kommt ein neuer Namensraum [org.junit.*] zum Einsatz, dieser enthält den annotationsbasierten Code. Das Paket [junit.framework] bleibt in der neuen Version bestehen, es wurden lediglich kleine Änderungen vorgenommen, um die Aufwärtskompatibilität zu sichern.
Zusätzlich wurde eine neue assert-Methode hinzugefügt, sie trägt den Namen "assertThat" und bekommt zwei Parameter übergeben. Der erste Parameter ist der tatsächliche Wert (im Gegensatz zu "assertEquals" als ersten Parameter) und einen sogenannten Matcher. Mit dem Matcher wird die zu testende Bedingung ausgedrückt.

Aus assertEquals(10, list.size());

wird

assertThat(list.size(), is(10));

Um die neue Funktion zu nutzen, müssen die Hamcrest-Pakete eingebunden sein:

import static org.hamcrest.core.Is.is;

Mit JUnit4.x wurden sechs unterschiedliche Annotationen eingeführt:

Literatur

Zur Literatur

Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite