• PHPUnit mittels PTI in Eclipse einbinden

    von Sven Haselböck 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.

    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.

    21 Kommentare »


    • Nils Langner
      am 14. Oktober 2009 um 08:39 Uhr

      Für mich ist PTI echt das Projekt des Jahres. Und da ich mit den Machern zur Zeit in Kontakt stehe, weiß ich auch, dass da noch wirklich tolle Dinge geplant sind.


    • Daniel S.
      am 14. Oktober 2009 um 10:30 Uhr

      Toller Artikel, zu einem nützlichen Tool.


    • Stephan Hochdoerfer
      am 14. Oktober 2009 um 11:49 Uhr

      Bin ja mal gespannt was noch so kommt :)


    • Zviki
      am 14. Oktober 2009 um 11:51 Uhr

      Since you are working on complex projects in Eclipse PDT, you might want to check out nWire for PHP. It is a new code exploration tool which provides real-time visualization, navigation and quick search. You can immediately see all the code associations. Works nicely with PEAR, too.

      Check it out: http://www.nwiresoftware.com/products/nwire-php


    • Sven Kiera
      am 14. Oktober 2009 um 16:57 Uhr

      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!


    • Fabian
      am 14. Oktober 2009 um 23:48 Uhr

      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?


    • Sven
      am 15. Oktober 2009 um 09:51 Uhr

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


    • Daniel
      am 15. Oktober 2009 um 22:26 Uhr

      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


    • Sven
      am 16. Oktober 2009 um 09:48 Uhr

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


    • Daniel
      am 16. Oktober 2009 um 13:31 Uhr

      Ja, die selbe die auch unter “Window -> Preferences -> PHP -> PHP Executables” als Default gesetzt ist.


    • KopfPit – Weblog » PHPUnit mittels PTI in Eclipse einbinden
      am 25. Oktober 2009 um 15:26 Uhr

      [...] PHPUnit mittels PTI in Eclipse einbinden | PHP hates me – Der PHP Blog. Tags: Ecl, Eclipse, PHP, phpunit, Plugin Post a Comment or Leave a Trackback [...]


    • Dominik
      am 5. November 2009 um 15:34 Uhr

      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?


    • b3nl
      am 4. Januar 2010 um 23:51 Uhr

      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.


    • Albert
      am 15. März 2010 um 23:30 Uhr

      Guter Artikel, mercie! Werde direkt meine selbstgebrauten Files mal checken.


    • Lorenz
      am 6. April 2010 um 14:33 Uhr

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

      any ideas?


    • Sven Kiera
      am 6. April 2010 um 15:56 Uhr

      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


    • Andreas
      am 7. April 2010 um 12:20 Uhr

      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


    • Sven Kiera
      am 7. April 2010 um 15:35 Uhr

      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


    • Andreas
      am 7. April 2010 um 17:38 Uhr

      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


    • Sven Kiera
      am 7. April 2010 um 19:00 Uhr

      Hi Andreas,

      werde den Fehler mal aufnehmen und mit dem nächsten Release beheben ;)

      Gruß,
      Sven


    • Coke
      am 28. Mai 2010 um 22:59 Uhr

      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.

    RSS-Feed für Kommentare zu diesem Artikel. TrackBack-URL

    Einen Kommentar hinterlassen

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.