am 14. Oktober 2009
Nils stellte bereits die Verwendung des “PHP CodeSniffers” mit Hilfe des Eclipse PHP Tool Integration (PTI) Pakets direkt aus der Eclipse-Entwicklungsumgebung (PDT) vor. PTI ist eine Sammlung von Eclipse-Plug-ins, die beliebte PHP-Entwicklungstools für die Eclipse-Entwicklungsumgebung zugänglich macht.
Ich möchte Euch kurz vorstellen wie Ihr zukünftige PHPUnit-Tests mit Hilfe von PTI direkt in Eurer Eclipse-Entwicklungsumgebung erstellen und ausführen könnt.
Was ist überhaupt dieses PHPUnit, dass habe ich noch nie gehört… Okay, besser spät als nie. PHPUnit ist ein in PHP geschriebenes Open Source Framework zum Testen von PHP-Skripten, welches für automatisierte Tests (meist Klassen oder Methoden) geeignet ist. Es ist das Tool der Wahl für die testgetriebene Entwicklung in PHP.
Wer sich jetzt noch fragt wozu diese Tests überhaupt nötig sind, sollte sich bitte die folgende Feststellung des PHPUnit Entwicklers Sebastian Bergmann dick und fett hinter die Ohren schreiben: “Alle Programmierer machen Fehler – gute Programmierer verwenden Tests, um Fehler im Code so früh wie möglich zu entdecken.” Also auf zum guten Programmierer…
Damit PHPUnit unter PTI installiert werden kann, muss die Development Update Site http://www.phpsrc.org/eclipse/pti-dev/ über “Help -> Install New Software” den Available Software Sites in Eclipse hinzugefügt werden. Daraufhin könnt Ihr PTI (PHP PEAR Library 1.01, PHP Tool Integration Core 1.02, PHP Tool PHPUnit 0.1.0) installieren. Nach einem Neustart von Eclipse werden wir noch schnell die Konfiguration von PHPUnit überprüfen. Dafür schauen wir in den Einstellungen “Window -> Preferences -> PHPTools -> PHPUnit” nach. Hier müsst Ihr einen Pfad zu einer php.exe (PHP Executable) angeben. Damit wir das Ergebnis (die Ausgabe) des PHPUnit Tests in der Console von Eclipse begutachten können, müssen wir noch “Debug -> print PHP output to console” aktivieren.
Zum Test erstellen wir in Eclipse eine neues Projekt mit dem Namen “phphatesme.com – PTI PHPUnit” und eine recht simple Klasse “Calculator”:
<?php
class Calculator
{
/**
* Addiert zwei Ganzzahlen und gibt deren Summe zurück
*
* @param int $a
* @param int $b
* @return int
* @throws Exception
*/
public function add($a, $b)
{
if (!is_int($a) || !isint($b)) {
throw new Exception('Invalid param(s).');
}
return $a + $b;
}
/**
* Subtrahiert zwei Ganzzahlen und gibt deren Differenz zurück
*
* @param int $a
* @param int $b
* @return int
* @throws Exception
*/
public function subtract($a, $b)
{
if (!is_int($a) || !isint($b)) {
throw new Exception('Invalid param(s).');
}
return $a * $b;
}
}
?>
Damit wir uns nun einen PHPUnit Test (Test Case) für die frisch gecodetete Calculator-Klasse erstellen lassen können, reicht ein rechter Mausklick auf die Datei “Calculator.php” und dann “PHP Tools -> PHPUnit -> Create Test Case”. Zu sehen auch auf dem folgenden Screenshot.

Abschließend sollte noch der Button “Finish” des selbsterklärenden Bildschirms “New PHPUnit Test Case” gedrückt werden.
Das Ergebnis kann im PHP-Explorer bestaunt werden – ein neu erstellter Ordner “tests”, der unseren ersten PHPUnit Test in Form der Klasse “CalculatorTest” beinhaltet. In der automatisch erstellten Klasse wurde für jede öffentliche Methode unserer Klasse Calculator eine Test-Methode angelegt. Wir wollen mit der Methode “testAdd()” beispielhaft unsere Methode “add()” der Klasse Calculator testen / prüfen. Hierfür passen wir die Methode “testAdd()” der Klasse CalucaltorTest wie folgt an:
/**
* @dataProvider dataProvider
*/
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}
Zusätzlich fügen wir der Klasse CalculatorTest noch folgende Methode hinzu:
public function dataProvider()
{
return array (
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
}
Die Methode “testAdd()” nutzt einen “dataProvider” (DocBlock Tag @dataProvider), dass heißt die Methode “dataProvider()” wird als Datenlieferant verwendet. Eine Datenprovider-Methode muss öffentlich sein und kann entweder ein Array von Arrays oder ein Objekt, das die Iterator-Schnittstelle implementiert hat und ein Array für jeden Iterationsschritt liefert, zurückgeben. In unserem Fall wird für jedes Daten-Array die Test-Methode mit dem Inhalt des Arrays als Argumente aufgerufen. Wenn unsere Methode “add()” der Klasse Calculator korrekt funktioniert, müsste beim Testdurchlauf für das Unterarray “array(1, 1, 3)” des Rückgabe-Arrays des Dataproviders ein Fehler ausgelöst werden. Denn der Methodenaufruf “assertEquals(3, 1 + 1)” behauptet nämlich, dass 1 + 1 = 3 ist.
Unsere Vermutung wollen wir nun überprüfen und starten unseren Test Case (Klasse CalculatorTest im Ordner tests) durch einen rechten Mausklick und dann “PHP Tools -> PHPUnit -> Run Test Case / Test Suite”. Das Ergebnis unseres Test Cases erhalten wir direkt in der Console von Eclipse.

Das Testergebnis ist jetzt keine große Überraschung mehr. Insgesamt wurden fünf Tests durchgeführt, ein Fehler ist aufgetreten und ein Test ist unvollständig.
Erwähnenswert hierbei ist, dass PTI sämtliche Ausgaben von PHPUnit in die Console schreibt und auch die Failures parst, um diese unter dem Tab “Problems” und direkt im Editor (Quellcode) aufzuführen.
Das war ein kurzer und schneller Überblick der Integration und Verwendung von PHPUnit mittels PTI in Eclipse. Wer jetzt richtig Lust auf das Schreiben von Tests bekommen hat, findet ausführliche Informationen zu PHPUnit auf der eigenen Projektseite.
Tipp zum Abschluss: Ihr könnt beim Schreiben von Tests auch die Autovervollständigung (Code-Assist) für Klassen und Methoden von PHPUnit aktivieren, indem Ihr unter “Window -> Preferences -> PHP -> PHP Libraries” eine PEAR User Library anlegt. Der Pfad zu PEAR ist: “PFAD_ZU_DEINER_ECLIPSE_IDE\plugins\org.phpsrc.eclipse.pti.library.pear_1.0.1.R20091005000000\php\library\PEAR”
Die PEAR User Library könnt Ihr jetzt einem oder mehreren beliebigen Projekt(en) zuordnen. Das ist schnell erledigt – rechter Mausklick auf das Projekt und dann “Include Path -> Configure Include Path -> Libraries -> Add Library”. Daraufhin wird Eclipse die neu zum Projekt hinzugefügte Library (PHP-Dateien) im Hintergrund parsen, damit sämtliche Klassen, Objekte, Methoden und Konstanten bekannt sind.