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.
Bei der Erzeugung eines Objektes der Klasse
PHPUnit2_Framework_TestSuite wird dem Konstruktor der
Name einer Klasse übergeben, die sich von
PHPUnit2_Framework_TestCase oder einer Kindklasse ableitet.
In diesem Fall wird der Testsuite für jede Methode dieser Klasse,
deren Name mit test beginnt, ein Testfall
hinzugefügt.
Bei der Erzeugung eines Objektes der Klasse
PHPUnit2_Framework_TestSuite wird dem Konstruktor kein
Parameter übergeben.
In diesem Fall können der zu Beginn leeren Testsuite mit der
Methode addTest($test) Testfälle hinzugefügt
werden. Bei dem Parameter $test handelt es sich
um eine Referenz auf ein Objekt einer Klasse, die die
Schnittstelle PHPUnit2_Framework_Test
implementiert. Für die Erzeugung eines solchen Objektes ist
dem Konstruktor der Name der zu testenden Methode zu
übergeben.
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.