PHP Funktionstests aus Netbeans mit Selenium

SeleniumIch hab da so ein Projekt, dass ich schon mehr als ein Jahr vor mir herschiebe: Eine Überarbeitung und Erweiterung einer bestehenden PHP-Applikation. Sie läuft eigentlich super, das Pflichtenheft ist gut und alle sind glücklich. Leider hat sich die „Erweiterung“ als Operation am Herzen herausgestellt. Der ursprüngliche Cöder hat eine ziemlich komplexe Struktur erarbeitet, in der er sich selbst ab und zu verheddert hat. Das bedeutet, dass zuerst ganz hässliche Strukturbugs als solche identifiziert und gefixt werden mussten. Im Zuge dieser Operation habe ich so ziemlich jeden Teil der Software berührt, beflucht und daran herumgewurschtelt.

Um etwas Sicherheit und Stabilität in die Sache zu bringen hätte ich gerne Unit Tests gehabt. Bei diesem Kludge sind aber so viele Komponenten beteiligt, dass es nicht so einfach klappt. Der Hammer musste eine Nummer grösser gewählt werden: Selenium.

Mit Selenium verbindet mich eine unerwiderte Liebe. Immer wieder versuche ich an das Tool heranzukommen, immer wieder scheitere ich irgendwie weil ich abgewiesen werde. So auch zu Beginn dieses Anlaufs: Die Funktionstests laufen (vielleicht), finden es aber unangebracht sich irgendwie zu melden. Die Doku ist gut, aber nirgends wird ein Überblick vermittelt und man muss die fragilen Einzelteile mit gutem Zureden zueinander bringen.

Hier mein Vorgehen, vielleicht erspart es irgendwem ein paar graue Haare:

  1. PHPunit fast wie in der Anleitung oder der Beschreibung installieren (ich hab mich gegen den Ubuntu Packagemanager entschieden):
    sudo apt-get install php-pear
    sudo pear channel-discover pear.phpunit.de
    sudo pear channel-discover components.ez.no
    sudo pear channel-discover pear.symfony-project.com
    sudo pear install -a channel://pear.phpunit.de/PHPUnit
    
  2. phpunit muss dem Netbeans bekannt gemacht werden: Tools → Options → PHP → Unit Testing → PHPUnit Script: /usr/bin/phpunit
  3. In Netbeans kann das PHP-Selenium-Plugin installert werden: Tools → Plugins → Available Plugins → Selenium Module for PHP → install. (Wenn hier keine Checkboxen sichtbar sind liegts an Ubuntu :(. Mit Space kann das Plugin trotzdem ausgewählt und installiert werden).
  4. Neue Selenium-Tests können dem Projekt hinzugefügt werden mittels rechter Maustaste → New → Other → Selenium → Selenium Test Case for PHP. Wichtig: Die PHP-Dateien und die Klassen (die gleich heissen sollte wie die Datei) müssen auf Test enden. Also beispielsweise die Datei UserTest.php mit Klasse UserTest. Wer das nicht macht, wird beim Ausführen mit dem Fehler PHP Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Could not find class "" in "/blah/NetBeansSuite.php".' in /usr/share/php/PHPUnit/Util/Skeleton/Test.php:125 bestraft.
  5. Das Netbeans-Plugin installiert einen Selenium RC-Server. Dieser nimmt Befehle entgegen und startet die Browser. Leider ist auch dieser futsch und meldet PHPUnit_Framework_Exception: Could not connect to the Selenium RC server. *gnah*!. Also ausschalten in Netbeans: Services → Selenium Server → Rechte Maustaste → Stop und bei Properties gerade das automatische Starten disablen.
  6. Nun den richtigen Server herunterladen und mit java -jar selenium-server.jar starten.
  7. Endlich kann getestet werden. In Netbeans rechte Maustaste auf das Projekt und „Run Selenium Tests“.

Gute Doku für die Selenium-Erweiterung von PHPUnit findet man auf der Website. Um das ganze API anzusehen, bemüht man am Besten den PHP-Documentor:

  1. sudo pear install phpDocumentor
  2. phpdoc --directory /usr/share/php/PHPUnit/ --target /path/to/some/free/doc/

Um die Tests zu erstellen kann entweder die Selenium IDE verwendet werden oder man macht die Tests „by Hand“ (wie ein richtiger Mann 🙂 ).

Oftmals möchte man wohl die Datenbank vor dem Ausführen der Tests mit bestimmten Werten laden. Wie das geht, zeigen die Antworten auf StackOverflow.

3 Gedanken zu “PHP Funktionstests aus Netbeans mit Selenium

  1. Ich habe auch schon oft mit und gegen PHPUnit gekämpft.
    Ich bin meistens daran gescheitert, dass ich entweder keine Möglichkeit hatte Unittests zu debuggen, oder beim Ausführen der Unittests nur eine nichtssagende Fehlermeldung bekam.
    Ich habe es damals über den „official way“ mit phpunit.bat, und dem PDT-Eclipse Plugin versucht.
    Dann stiess ich auf dieses Projekt. Bis jetzt für mich der beste Weg um Unittests auszuführen.

  2. Der Link ist echt gut! Das sieht wirklich wunderschön aus!
    Mit dem Debuggen hatte ich aus Netbeans bis Dato noch keine Probleme…?

  3. Spät antworten ist hoffentlich besser, als nie antworten :]
    Ich weiss nicht, wie das Ausführen von Unittests in Netbeans funktioniert.
    Ich habe damals mit der PHPUnit Funktionalität des PTI Eclipse-Plugin gearbeitet (im alten Post fälschlicherweise PDT-Eclipse Plugin genannt).
    PTI führt PHP-Unit als .bat File aus. Dadurch ist Debugging nicht möglich.
    Ich hatte dann die Nase voll und habe mir einen eigenen Testrunner (und Autoloader) für PHP-Unit geschrieben und das im letzten Post referenzierte Projekt als GUI-benutzt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.