Testfälle ausführen und zusammenfassen

Eine Gruppe von Testfällen, Testsuite genannt, wird mit der Klasse PHPUnit2_Framework_TestSuite zusammengefasst und ausgeführt. Hierfür gibt es zwei Möglichkeiten.

Für die Ausführung der Testfälle einer Testsuite wird ein Objekt der Klasse PHPUnit2_Framework_TestResult benötigt, das die Ergebnisse der einzelnen Testfälle für die spätere Auswertung aufnimmt. Mit Hilfe des Beobachter-Entwurfsmusters, das wir in Kapitel 7 näher betrachten werden, kann der Testverlauf durch Objekte, die sich von PHPUnit2_Framework_TestListener ableiten, beobachtet werden.

Mit dem für die Kommandozeile entwickelten TextUI TestRunner führen wir nun die Testfälle der Klasse BankAccountTest aus. Die Quelldateien BankAccount.php und BankAccountTest.php müssen hierfür entweder im aktuellen Verzeichnis oder im include_path liegen.

Abbildung 4.2. Ausführen der Testfälle einer Testfallklasse

phpunit BankAccountTest
PHPUnit 2.2.0 by Sebastian Bergmann.

..

Time: 0.002204

OK (2 tests)


Für die automatisierte Ausführung von Testsuiten bietet sich der direkte Aufruf der Methode PHPUnit2_TextUI_TestRunner::run() aus dem Quelltext der Testsuite heraus an. Durch die Möglichkeit, Instanzen von PHPUnit2_Framework_TestSuite ineinander zu schachteln, können die Testfälle hierarchisch organisiert werden: Eine Klasse Projekt_Tests_AllTests (Beispiel 4.3) nimmt die Testfälle des gesamten Projektes auf. Für jedes Paket des Projekt gibt es eine Klasse (Beispiel 4.4), in der die Testfälle für die Klassen des Paketes zusammengefasst sind. Die einzelnen Testfälle sind in Klassen wie Projekt_Tests_Paket_Klasse (Beispiel 4.5) implementiert.

Beispiel 4.3: Die Klasse Projekt_Tests_AllTests

<?php
if (!defined('PHPUnit2_MAIN_METHOD')) {
  define(
    'PHPUnit2_MAIN_METHOD',
    'Projekt_Tests_AllTests::main'
  );
}
 
require_once 'PHPUnit2/Framework/TestSuite.php';
require_once 'PHPUnit2/TextUI/TestRunner.php';
 
require_once 'Projekt/Tests/Paket/AllTests.php';
 
class Projekt_Tests_AllTests {
  public static function main() {
    PHPUnit2_TextUI_TestRunner::run(self::suite());
  }
 
  public static function suite() {
    $suite = new PHPUnit2_Framework_TestSuite('Projekt');
 
    $suite->addTest(Projekt_Tests_Paket_AllTests::suite());
 
    return $suite;
  }
}
 
if (PHPUnit2_MAIN_METHOD ==
    'Projekt_Tests_AllTests::main') {
  Projekt_Tests_AllTests::main();
}
?>


Die AllTests-Klassen implementieren einen Mechanismus, der der statischen Methode main() von Java entlehnt ist. Die Ausführung der Quelltextdatei einer solchen Klasse durch den PHP-Interpreter führt somit zur Ausführung der entsprechenden Testfälle.

Beispiel 4.4: Die Klasse Projekt_Tests_Paket_AllTests

<?php
if (!defined('PHPUnit2_MAIN_METHOD')) {
  define(
    'PHPUnit2_MAIN_METHOD',
    'Projekt_Tests_Paket_AllTests::main'
  );
}
 
require_once 'PHPUnit2/Framework/TestSuite.php';
require_once 'PHPUnit2/TextUI/TestRunner.php';
 
require_once 'Projekt/Tests/Paket/Klasse.php';
 
class Projekt_Tests_Paket_AllTests {
  public static function main() {
    PHPUnit2_TextUI_TestRunner::run(self::suite());
  }
 
  public static function suite() {
    $suite = new PHPUnit2_Framework_TestSuite(
      'Projekt / Paket'
    );
 
    $suite->addTestSuite('Projekt_Tests_Paket_Klasse');
 
    return $suite;
  }
}
 
if (PHPUnit2_MAIN_METHOD ==
    'Projekt_Tests_Paket_AllTests::main') {
  Projekt_Tests_Paket_AllTests::main();
}
?>


Beispiel 4.5: Die Klasse Projekt_Tests_Paket_Klasse

<?php
require_once 'PHPUnit2/Framework/TestCase.php';
 
require_once 'Projekt/Paket/Klasse.php';
 
class Projekt_Tests_Paket_Klasse
extends PHPUnit2_Framework_TestCase {
  public function testMethode() {
    $t = new Projekt_Paket_Klasse;
    $this->assertTrue($t->methode('test'));
  }
 
  // ...
}
?>


Wir haben nun gesehen, wie für PHP-Klassen Testfälle für die automatische Ausführung und Auswertung mit PHPUnit geschrieben werden. Wer mehr über das Testen von Software mit Unit Tests lesen möchte, dem sei das Buch "Softwaretests mit JUnit" von Johannes Link [Link2005] empfohlen. Dieses befasst sich mit der Entwicklung von Unit Tests für Java mit JUnit, viele der Ideen und Lösungen lassen sich jedoch problemlos auf PHP und PHPUnit übertragen.