Facebook
Twitter
Google+
Kommentare
37

PHPUnit mittels PTI in Eclipse einbinden

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.

Window_Preferences_PHPTools_PHPUnitZum 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.

PHPTools_PHPUnit_CreateTestCase

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.

Console_Test_Case_Ergebnis

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.

Über den Autor

Sven Haselböck

Kommentare

37 Comments

  1. Erstmal guter Artikel und danke, dass du mir einen Teil der Arbeit mit dem Beitrag abgenommen hast :). Seit dem Wochenende steht bereits eine aktualisierte Version von PTI PHPUnit zur Verfügung und dieses Wochenende wird wahrscheinlich die nächste Aktualisierung folgen. Bin für jeden Tester dankbar und für alle Anregungen, Wünsche und natürlich Fehlermeldungen offen!

    Reply
  2. Danke für den Artikel. Ich stell mir nur gerade die Frage, wie ich PHPUnit in Verbindung mit einem Framework nutzen kann, dass auf MVC aufsetzt?

    Reply
  3. @Fabian
    Beim Zend Framework z. B. werden UnitTests auch mit ausgeliefert. Einfach mal reinschauen. Besser noch: Im PHP Magazin ist auch mal ein 3-teiliger Artikel zum Thema UnitTests fürs Zend Framework von Ralf Eggert erschienen. Ich glaube das Ende der Artikelserie war vor 3 Monaten (unsicher).

    Freut mich, dass Ihr mit dem Artikel was anfangen könnt.

    Reply
  4. Danke für diesen Artikel.
    Aber ich kann machen was ich möchte, wenn ich das hier
    „reicht ein rechter Mausklick auf die Datei “Calculator.php” und dann “PHP Tools -> PHPUnit -> Create Test Case”.“
    mache öffnet sich einfach kein Bildschirm, es passiert einfach nichts.
    Hab mir auch die neueste Version von PDT von http://eclipse.org/pdt/ heruntergeladen und es mit diesem „nackten“ Eclipse versucht, es passiert einfach nichts.
    Hat vielleicht jemand eine Idee an was das liegen könnte?
    Danke schonmal und Gruß

    Daniel

    Reply
  5. Hast du auch eine „PHP Executable“ im Config-Bildschirm von PHPUnit angegeben? Zu finden unter „Window -> Preferences -> PHPTools -> PHPUnit“

    Reply
  6. Also bei mir läuft es, nur wird die Ausgabe bei mir nur in der Konsole geschrieben, aber im Screenshot war ja die fehlgeschlagenen Assertion noch unterstrichen, das ist bei mir leider nicht so? Muss ich da noch was konfigurieren?

    Reply
  7. Hörmal Mister K ;), da spinnt meine PHPUnit Installation grade und will eine @dataProvider-Annotation auflösen, ich google nach dem Problem und schon finde ich Code von dir. Reicht das nicht, dass ich dich im Büro sehe 😉 Schön das PTI so gut läuft.

    Reply
  8. bei mir ist der Menüpunkt „Create Test Case“ nicht sichtbar. Ich sehe dort nur „Run TEst Case“.

    any ideas?

    Reply
  9. Hi Lorenz,

    die Erstellung von Test Case Klassen hat sich geändert. Um nun eine Test Case Klasse zu erstellen, einfach rechte Maustaste und dann „New -> PHPUnit Test Case“ auswählen.

    Sollte die Auswahl dort nicht erscheinen, kannst du entweder einmal die Perspektive reseten (ist hier leider ein Eclipse Problem) oder über „New -> Other“ auswählen. „PHPUnit Test Case“ befindet sich dort unterhalb von PHP -> PHPUnit.

    Gruß,
    Sven

    Reply
  10. Hallo Sven,

    ich habe gerade die Tools über die Update-Site installiert. Wenn ich jetzt – wie du beschreibst – einen Test Case erstellen will (New->Other->PHPUnit->PHPUnit Test Case),
    passiert bei einem Click auf ‚Next‘ nichts und ich bekomme folgende Exception:

    Unhandled event loop exception

    java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1937)
    at org.phpsrc.eclipse.pti.tools.phpunit.ui.wizards.PHPUnitTestCaseCreationWizardPage.dialogChanged(PHPUnitTestCaseCreationWizardPage.java:342)

    Irgend eine Idee?

    Grüße,
    Andreas

    Reply
  11. Hi Andreas,

    ist das zufällig eine Testdatei die auf der obersten Ebene liegt, also in keinem Unterordner? Wenn ja, versuch die Datei mal bitte in einem Unterordner anzulegen. Die Codestelle versucht das aktuelle Projekt zu ermitteln und scheint hier Probleme zu haben.

    Ich wollte für die nächste Version eh noch ein paar Optimierungen machen, dann kann ich das Problem direkt auch beheben 😉

    Gruß,
    Sven

    Reply
  12. Hi Sven,

    super, vielen Dank! Das war’s. Die Datei lag in der Tat auf der obersten Ebene. Liegt die Datei in einem Unterordner, kann ich einen Test Case erstellen.

    Grüße,
    Andreas

    Reply
  13. Hi, ich hab das ganze auch gerade mal probiert. Pfad zu PHP ist korrekt gesetzt und php File in einem Unterordner. Wenn ich Den Testcase erstellen möchte passiert allerdings nichts. Es gibt stattdessen ein „Unhandled Event Loop Exception im Plugin org.eclipse.ui“. Eclipse build 20100218-1602 (PDT) und aktuelles PTI … unter OSX.

    Reply
  14. Habe heute versucht, einen Test zu erstellen, habe auch den Menüpunkt gefunden, nachdem ich die alten Kommentare gelesen hatte, aber nachdem ich den ausgewählt hatte, passierte auf ‚next‘ nichts.
    Was ist zu tun?

    Gruß
    Jörg

    Reply
  15. Hallo Kiera
    ich habe PHPUnit wie beschrieben mittels PTI in eclipse eingebunden, das calculator – Beispiel erstellt und wollte im PHP – Explorer einen Test erstellen. Also rechte Maustaste auf calculator.php – new – other. Der Wizard „Select a Wizard“ öffnet sich, ich wähle PHP – PHPUnit – PHPUnit Test Case. Mit „next“ öffnet sich das Fenster „New PHPUnit Test Case“. Nachdem ich die Einstellungen getroffen habe wähle ich „Finish“ und es passiert nichts. Gestern passierte seltsamerweise allerding schon bei „next“ nichts.
    Leider kann ich kein Bild mitsenden, sonst würde ich mal einen snapshut der Einstellungen mitsenden.

    Gruß Jörg

    Reply
  16. Hallo Sven,
    entschuldige, dass ich im letzten Kommentar „Hallo Kiera“ geschrieben habe, da hatte ich wohl gerade einen Knick in der Optik.
    Ansonsten wäre es gut, mal einen neuen Artikel zu dem Thema zu verfassen, da es ja Änderungen gegeben hat.
    Wenn ich den Test zum laufen bringe, würde ich das auch machen

    Gruß Jörg

    Reply
  17. Hallo Sven,

    ich bin inzwischen weitergekommen, indem ich „Target folder“ nicht mit den schon eingetragenen Text verwendet habe, sondern über „browse“ gegangen bin.
    Jetzt habe ich also eine Test – Datei „CalculatorTest“….

    Gruß Jörg

    Reply
  18. Hallo Jörg,

    hat sich dein Problem damit erledigt oder hast du noch Fragen dazu? Wenn du noch Fragen hast, schick mir am besten eine Mail an sven@kiera.de, dann kannst du da auch einen Screenshot anhängen :-)

    Aktuell bin ich dabei eine Anleitung (auf Englisch) für PHPUnit mit PTI zu schreiben, brauche aber leider noch etwas Zeit dafür.

    Gruß,
    Sven

    Reply
  19. Hallo Sven,

    Ich habe noch Problem „PHPUnit Test Case“ mit „New“ zu erstellen. So habe ich gemacht: rechte Maustaste auf calculator.php – new – other. Der Wizard “Select a Wizard” öffnet sich, ich wähle PHP – PHPUnit – PHPUnit Test Case. Mit “next” öffnet sich das Fenster “New PHPUnit Test Case”. Und dann kann ich „Source“ weder eingeben noch mit „search“ Button finden. Habe ich jegendwas vergessen? Danke erst mal!

    Gruß,

    Changyong

    Reply
  20. Hallo Christoph,

    leider kann ich bis jetzt nicht das Problem reproduzieren. Kannst du mir an die oben genannte Adresse weitere Informationen zu deinem System schicken? Danke!

    Ich würde euch gerne bitten, sofern dies noch der Fall ist, nicht mehr die Development Update Site zu nutzen, sondern die Stable unter http://www.phpsrc.org/eclipse/pti/. Danke! :)

    Gruß,
    Sven

    Reply
  21. Hallo,

    gibt es inzw. eine Lösung für das Problem von Changyong und Christoph, dass in dem Wizard bei Anlegen eines Tests die Source-Datei nicht ausgewählt werden kann?

    Das Problem taucht bei mir nämlich leider auch auf… :-(

    Grüße,
    Marcus

    Reply
  22. Hallo,
    ich habe versucht, das PHPUnit heute auszuprobieren, aber ich bekomme leider einen „Access denied.“ Fehler unter Windows 7 wenn ich versuche zu einer existierenden Klasse einen Testcase zu erstellen.

    In der PHP Tools Output Klasse steht:
    „C:\xampp\php\php.exe“ -c C:\Users\CHRIST~1\AppData\Local\Temp\zend_debug\session6504705472340660511.tmp -d asp_tags=off „C:\Program Files (x86)\eclipse\plugins\org.phpsrc.eclipse.pti.tools.phpunit_0.7.1.R201102130000000\php\tools\phpunit.php“ –skeleton-test User C:\web\www\typo3conf\ext\project\User.php UserTest C:\web\www\onlylocal\tests\UserTest.php
    PHPUnit 3.5.13 by Sebastian Bergmann.

    Access denied.“

    Wenn ich den Befehl von der Konsole ausführe und beim -c Parameter den Pfad ändere auf c:\session6504705472340660511.tmp dann kommt nicht der Access denied Fehler sondern halt welche wegen fehlender Pfade.
    Die Fehlermeldung kommt auch, wenn ich den Ordner explizit für Jeden mit Lese- und Schreibzugriff freigebe und meinem Windows User gehört er natürlich sowieso…

    Hast Du vielleicht eine Idee woran das liegen könnte?

    Danke und Grüße,
    Christopher

    Reply
  23. Hallo Sven,

    vielen Dank für die Anleitung. Hat leider nur so behelfsmässig mit $a=1, $b=2, $c=3 default values geklappt, sonst erhalte ich ERROR: missing argument 1, Die Option PHP Tools ->testCase erstellen fehlt bei mir als Menueintrag in Eclipse.

    assertEquals($c, $a + $b);
    }

    public function dataProvider()
    {
    return array (
    array(0, 0, 0),
    array(0, 1, 1),
    array(1, 0, 1),
    array(1, 1, 3)
    );
    }
    }
    //was ist denn los dass das nur so geht, ist was falsch benannt?

    danke und lg peter

    Reply
  24. doch alles titop geklappt failures/passes korrekt.
    Und auch das generieren eines TestCases mittels ->new->unitTestCase

    tausenddank!

    peter

    Reply
  25. Erstmal, danke für den Artikel – er hat mich weitergebracht.

    Mein Problem ist dass ich mit rechter Mausklick auf meiner (handgeschriebene) Testdatei erscheint zwar „PHP Tools“ -> „PHPUnit“ -> „Run PHP Unit Test“. Jedoch als ich das auswähle, erscheint in der Console „No test case/ test suite found for file …“. Muss ich zuerst eine Bootstrap Datei schreiben? Ich teste im übrigens Classes die später als Extensions für TYPO3 dienen soll; daher befinden sich die Dateien in Classes/Domain/Model/ bzw. Tests/Domain/Model.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen