• PHPUnit mittels PTI in Eclipse einbinden

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

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


    • Jörg
      am 30. November 2010 um 15:09 Uhr

      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


    • Sven Kiera
      am 30. November 2010 um 21:40 Uhr

      Hallo Jörg,

      was genau hast du versucht? Kannst du mir da ein paar mehr Infos geben? :)

      Gruß,
      Sven


    • Jörg
      am 1. Dezember 2010 um 08:12 Uhr

      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


    • Jörg
      am 1. Dezember 2010 um 08:30 Uhr

      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


    • Jörg
      am 1. Dezember 2010 um 09:48 Uhr

      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


    • Sven Kiera
      am 1. Dezember 2010 um 10:27 Uhr

      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


    • Changyong
      am 19. Dezember 2010 um 13:26 Uhr

      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


    • Christoph
      am 7. Januar 2011 um 02:08 Uhr

      Hi,

      habe das gleiche Problem wie Changyong.. gibts dazu eine Lösung?

      Gruß,
      Christoph


    • Sven Kiera
      am 7. Januar 2011 um 08:38 Uhr

      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


    • Marcus Beranek
      am 30. Januar 2011 um 17:45 Uhr

      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


    • Sven Kiera
      am 31. Januar 2011 um 13:41 Uhr

      Hallo Marcus,

      leider konnte ich das Problem noch nicht lokalisieren und bin noch auf der Suche :-(

      Gruß,
      Sven


    • Christopher
      am 11. April 2011 um 19:13 Uhr

      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


    • peter
      am 23. Mai 2011 um 17:58 Uhr

      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


    • peter
      am 23. Mai 2011 um 18:34 Uhr

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

      tausenddank!

      peter

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

    Hinterlasse einen Kommentar

    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.