Skip to content

PHPUnit für die Entwicklung von Serendipity-Plugins

Geben wir es ruhig zu, der PHP-Code von Serendipity ist nicht mehr State of the Art, sondern zum großen Teil noch auf dem Stand von PHP 4. Dass dieser Code immer noch sehr zuverlässig funktioniert, und ob und wie mit dem aktuellen Stand umzugehen ist, soll hier nicht das Thema sein. Ich möchte hier auf die Entwicklung von Serendipity-Plugins eingehen, die nicht umsonst in einem eigenen Repository leben. Deren Qualität lässt sich mithilfe von Unit Tests sicherstellen.

PHPUnit für Plugins

Auch wenn die Grundfunktionalität von Serendipity durch Unit Tests abgedeckt ist: Die Plugin-Entwicklung ist bisher nicht so einfach zu testen. In meinen letzten Projekten waren Unit Tests mit PHPUnit ein zunehmend zentraler Bestandteil der Entwicklung. Entweder damit ich nachträglich sicherstellen konnte, dass Klassen und Methoden bei Veränderungen und Refactoring noch taten, was sie tun sollten; oder weil ich testgetrieben entwickelte, das heißt zuerst die Unit Tests und dann erst den zu testenden Code schrieb. Dieses Vorgehen möchte ich nicht mehr missen, und es hat mich gestört, dass es bei der Entwicklung von Serendipity-Plugins nicht ohne Weiteres möglich war.

Screenshot einer Konsole mit erfolgreich durchlaufenen Unit Tests

Daher habe ich mich hingesetzt und PHPUnit so in meine lokale Serendipity-Installation, die ich zum Entwickeln verwende, integriert, dass ich einzelne (Event-)Plugins separat testen kann. Die spezifischen Herausforderungen ließen sich recht schnell überwinden:

  • In Serendipity werden Plugins stark getrennt vom Core über Event-Hooks ausgeführt. Diese Hooks müssen natürlich einzeln getestet werden können.
  • Viele Variablen sind als global deklariert oder werden per Referenz "herumgereicht". Das erfordert einige Workarounds, die heute dank Dependency Injection und ähnlichen Entwurfsmustern zum Glück überflüssig sind.
  • Data Fixtures: Um Serendipity für die Tests "hochzufahren", wird eine Datenbankverbindung benötigt. Mir ist es bisher nicht gelungen, eine der unter Database Testing aufgeführten Methoden umzusetzen. Besser gesagt: Ich war einfach zu faul und habe die nötigen Daten in einer SQLite-Datenbank hinterlegt.

Und jetzt alle!

Alle nötigen Dateien habe ich ein GitHub-Repository https://github.com/mattsches/s9y-plugins-phpunit gepusht, inlusive Installationsanleitung. Kurz auf deutsch zur Benutzung: Das Repo nach tests/plugins entpacken, die phpunit.xml.dist nach phpunit.xml kopieren (und ggf. editieren), und es kann losgehen. Die Testklassen gehören in ein Verzeichnis tests im jeweiligen Event-Plugin-Verzeichnis. Eine Beispiel-Testklasse ist im Repo enthalten.

Bitte probiert dieses Test-Setup doch bei Gelegenheit einmal aus. Über Feedback, Verbesserungsvorschläge und konstruktive Kritik würde ich mich freuen, denn das Ganze habe ich eher zügig heruntergeschrieben - da ist bestimmt noch Luft nach oben. Bei Problem postet ihr am besten hier in die Kommentare oder ins Development-Forum. Oder ihr tragt ein Issue auf GitHub ein. Im Idealfall forkt ihr einfach das Repo, fixt die Bugs und setzt einen Pull Request ab!

Ich habe mittlerweile schon einige Tests für eine Handvoll Plugins geschrieben, z.B. für das Markdown- oder das Facebook-Plugin. Wenn gewünscht, kann ich hier oder im Forum den Code dazu posten. Ich hoffe, dass wir bald möglichst viele Plugins mit Unit Tests abdecken können und diese vielleicht irgendann fester Bestandteil der Plugin-Entwicklung werden. Denn auch wenn die Zahl der aktiven Entwickler nicht mehr so groß ist wie früher, so gibt es doch noch eine ganze Menge Serendpity-Blogs da draußen - mit stabilem Kern, aber teilweise etwas aus dem Ruder gelaufenen Plugins (steile These zum Abschluss) ;-)

Trackbacks

s9y am : s9y via Twitter

Vorschau anzeigen
PHPUnit für die Entwicklung von Serendipity-Plugins: http://t.co/DjsYSfnM ^ @mattsches

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Markdown-Formatierung erlaubt
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Formular-Optionen

Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!