Advanced   Java   Services TestSuite


Mehrere Tests zu einer Folge zusammenstellen

Eine TestSuite ist eine Folge von Tests die zusammen und nacheinander ablaufen. Man kann in einer TestSuite verschiedene Tests kombinieren oder auch die gleichen Tests mehrmals wiederholen. Zum Erstellen einer TestSuite kann man einen Wizard benutzen, den den JUnit in Eclipse bereitstellt oder auch eine TestSuite selbst schreiben.


Eine TestSuite mit dem Wizard von JUnit erstellen

Am einfachsten ist es die schon vorhandene Testdatei des Projekts zu markieren, dann ist man gleich im richtigen Verzeichnis.

Kontextmenü -> New -> Other -> JUnit -> TestSuite

Wir akzeptieren den Namen "AllTests" und erhalten folgende Klasse.

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses( {DatumTest.class} )
public class AllTests
{

}

Die Klasse bleibt leer. Die zweite Annotation steuert das Verhalten. Wollen wir verschiedene Tests zusammenbinden, so schreiben wir etwa

@SuiteClasses( {DatumTest.class, FooTest.class, FooTest2.class} )

Tests wiederholen kann man, indem man mehrere gleiche Einträge schreibt.

@SuiteClasses( {DatumTest.class, DatumTest.class, DatumTest.class} )

Eine einfache TestSuite selbst entwerfen

Wir legen in unserem Testverzeichnis zusätzlich zur vorhandenen Testklasse eine neue Klasse an, beispielweise mit dem Namen RepeatTests, und füllen sie wie folgt.

import junit.framework.Test;
import junit.framework.TestSuite;

   public class RepeatTests
   {
      public static Test suite()
      {
         // leere TestSuite anlegen
         TestSuite suite = new TestSuite();

         // TestSuite füllen
         for(int i = 0; i < 3; i++)
         {
            suite.addTestSuite(DatumTest.class);
         }

         // TestSuite zurückgeben (TestSuite implementiert das Interface Test)
         return suite;
      }
   }

Die Klasse muß eine statische Methode der obigen Form haben (static, Name der Methode, Typ des Returnwerts), damit JUnit die Methode aufrufen kann. Der Name der Klasse ist dagegen frei wählbar. Eine kleine Hürde bietet noch die Methode addTestSuite(), denn diese hat die Signatur void  addTestSuite(java.lang.Class<? extends TestCase> testClass). Unsere Testklasse muß also von TestCase erben. Dies ist jedoch kein Aufwand, wir können

public class DatumTest

ergänzen zu

public class DatumTest extends TestCase

ohne zusätzliche Änderungen vornehmen zu müssen.

Nun markiert man die Datei RepeatTests im Package Explorer und ruft JUnit wie bisher.


Tests parallel laufen lassen mit ActiveTestSuite

Mit einer kleinen Änderung der vorigen TestSuite gelingt es, die Tests parallel laufen zu lassen. Mit der Klasse junit.extensions.ActiveTestSuite ist das recht einfach. In der API heißt es A TestSuite for active Tests. It runs each test in a separate thread and waits until all threads have terminated. Im wesentlichenersetzen wir nur zwei Wörter:

public class RepeatTests
{
   public static Test suite()
   {
      ActiveTestSuite suite = new ActiveTestSuite();

      for(int i = 0; i < 3; i++)
      {
         suite.addTestSuite(DatumTest.class);
      }
      return suite;
   }
}

Läßt man die Suite mehrmals laufen so wird man sehen, daß sich die Reihenfolge des Ablaufs ändert. Ein typisches Zeichen dafür, daß mehrere Threads arbeiten.