. Softwaretechnik WS2011 - JUnit

JUnit

Hr. Iglers JUnit-Anleitung: junit.pdf


Projekt einrichten und Testklasse erzeugen
Schritt 1: JUnit-Testcase anlegen: Im Contextmenü des Projekts die Option "New" => "JUnit Testcase" aufrufen:
JUnit Testcase (1)
Im nächsten Schritt gibt man dem Testcase einen Namen und ein Package (ich empfehle ein eigenes Package für alle Tests). Wichtig ist, dass "JUnit 4" verwendet wird (Default). Im Feld "Class under test" könnte man eine Klasse wählen, für deren public Methoden dann im nächsten Schritt Rümpfe von Testmethoden erzeugt werden, aber das hilft nicht allzuviel.
JUnit Testcase (2)

Beim Hinzufügen des ersten TestCase kommt eine Abfrage "JUnit dem BuildPath zufügen". Dies bejahen wir natürlich:
JUnit Testcase (3)
Sollten wir dies vergessen haben, könnten wir das nachträglich in den Projekteigenschaften nachholen:
JUnit Testcase (4)


Code der Testklasse
Jetzt können wir den Code der Testklasse bauen. Zuerst einmmal der Code der Klasse "Dreieck", auf der der Test aufbaut (um euch das Leben nicht zu einfach zu machen, gibt es nur einen Ausschnitt ;-)):
package de.hsrm.cs.swt.dreieck;

public class Dreieck
{
  public enum Status
  {
    gleichseitig, 
    gleichschenklig, 
    ungleichseitig
  }

  public static void main(String[] args) throws Exception
  {
    Dreieck.checkDreieck(args);
  }

  public static Status checkDreieck(String[] args) throws Exception
  {
    ...diverse Parameterchecks - werfen allesamt eine Exception...
	
    if (...Bedingungen für "nicht ungleichseitig"...)
    {
      if (...Bedingungen für "gleichseitig"...)
      {
        return Status.gleichseitig;
      }

      return Status.gleichschenklig;
    }

    return Status.ungleichseitig;
  }
}

Und so sieht der Test aus:
package de.hsrm.cs.swt.dreieck.test;

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

import org.junit.Test;

import de.hsrm.cs.swt.dreieck.Dreieck;

public class DreieckTest
{

  @Test
  public void testUngleichseitig() throws Exception
  {
    Dreieck.Status status = Dreieck.checkDreieck(new String[] { "2", "2", "2" });
    Assert.assertEquals(Dreieck.Status.ungleichseitig, status);
  }

  @Test
  public void testStringEingabe() throws Exception
  {
    try
    {
      Dreieck.checkDreieck(new String[] { "a", "2", "3" });

      Assert.fail("Exception fehlt!");
    }
    catch (Exception ex)
    {
      // OK so!
    }
  }

}
Wichtig ist hierbei, dass man jede Methode, die einen Test darstellt, mit der Annotation "@org.junit.Test" versieht. Ansonsten gilt für Testmethoden nur, dass sie keine Rückgabe und keine Parameter haben dürfen. Falls eine der zu testenden Methoden eine Exception werfen könnte, kann man eine "throws Exception"-Deklaration an die Methode anhängen (denn eine Exception im Test selbst ist ja ein fehlgeschlagener Test - JUnit kümmert sich um die Behandlung dieses Fehlers).

Anmerkung: der Test in der Methode testUngleichseitig ist bewußt "falsch" gebaut, denn bei diesen Eingabeparametern sollte nicht "ungleichseitig" als Status kommen. Dadurch erhalten wir einen fehlschlagenden Test und ich kann dies in den folgenden Screenshot zeigen. Es verdeutlicht außerdem ein reales Problem: der Anwendungscode ist korrekt, aber der Unittest-Code enthält einen Bug ;-).


Ausführen
Rechtsklick auf den Test, "Run as" => "JUnit Test":
Test ausführen (1)
Jetzt geht ein neues Fenster auf, in dem wir den Status der Tests sehen, und im Fehlerfall die Fehlermeldung und den StackTrace:
Test ausführen (2)

Weitere Vertiefung bleibt euch überlassen ;-)





Stand 23.11.2011
Historie:
23.11.2011: Erstellt aus Vorjahresbeispiel, ein wenig Feinschliff, Codeausschnitte aus der Klasse "Dreieck"