Skip to content

Tester's Little Helpers

Gestern Abend habe ich im Rahmen des Treffens der PHP User Group Rheinhessen einige Tools, Helferlein und ausgewachsene Frameworks vorgestellt, die Entwickler beim Schreiben von Tests unterstützen können. In den vergangenen Monaten sind nämlich einige in meiner Bookmark-Liste gelandet. Viele dieser Tools sind opinionated, also eigensinnig, was durchaus kontroverse Meinungen in unserer Runde herausforderte.

Wir tauschten uns auch über Best Practices im Bereich Testing aus: Wie wichtig ist eine hohe Code Coverage? Sollten Test Cases im selben Namespace liegen wie die zu testenden Objekte? Wie gehen wir mit Testdaten in Datenbanken um? Sollte unter verschiedenen PHP-Versionen getestet werden (z.B. bei TravisCI)? Ich glaube, jeder konnte etwas vom gestrigen Abend für sich mit nach Hause bzw. mit ins Projekt nehmen.

Weil ich meine Slides relativ kurzfristig zusammengestellt habe, möchte ich sie hier (noch) nicht veröffentlichen. Die von mir gesammelten Tools will ich aber niemandem vorenthalten:

  • Faker: Eigentlich eine Bibliothek zum schnellen Generieren von Dummy-Daten (Benutzernamen und -adressen, Internetadressen, Lorem Ipsum-Text uvm.), lassen sich mit Faker aber auch Dummy-Daten für Unit Tests erzeugen (z.B. für @dataProvider). Faker kann mit ORM wie Propel oder Doctrine umgehen und Dummy-Daten für bestehende Entities erstellen.
  • Patchwork: Eine Bibliothek zum Überschreiben von Benutzer-definierten Funktionen. Kann eine große Hilfe beim Testen von "untestbarem" Legacy-Code sein, etwa wenn in die Jahre gekommene Bibliotheken noch kein OOP verwenden. Ich nutze es für einige Tests von Metatron.
  • phpunit-mockfunction: Geht noch einen Schritt weiter als Patchwork, benötigt aber runkit. Damit lassen sich dann auch PHP-eigene Funktionen mocken bzw. überschreiben. Ob man das überhaupt möchte, sollte genau überlegt sein.
  • Mockery: Ein Mock Objekt-Framework, das nicht nur mit PHPUnit eingesetzt werden kann. Je nach Anforderung lässt es sich meiner Meinung nach etwas flexibler nutzen als die Mock-Methoden von PHPUnit, außerdem finde ich die Syntax angenehmer. Ist aber Geschmackssache.
  • Prophecy: Hat aufgrund der Benamung der Klassen und Methoden für einige Lacher gesorgt, ist aber ein flexibles Mocking-Framework, wenn man die Syntax erstmal verinnerlicht hat. Durchaus einen Blick wert.
  • Mutagenesis: Mutation Testing war neu für mich, ist aber ein cleveres Konzept, wenn die Testabdeckung eines Projekts bereits hoch ist. Mutagenesis benötigt ein spezielles runkit und verändert den zu testenden Quellcode zur Laufzeit anhand von Regeln so, dass Schwachstellen in den Unit Tests aufgedeckt werden können. Beispielsweise kann es vorkommen, dass nicht alle möglichen Pfade innerhalb einer Methode (mit vielen if/else-Anweisungen) getestet werden.
  • Fuzzer: Tolleiv hat auf diesen Test Helper für FLOW3 hingewiesen, der etwas ganz ähnliches macht wie Mutagenesis. Auch Fuzzer hilft dabei, "vergessene" Edge Cases aufzuspüren.
  • phpspec: Dieses Toolset verfolgt einen BDD-artigen Ansatz, den die Macher SpecBDD nennen. Während im "klassischen" BDD das Verhalten in Stories beschrieben wird, setzt phpspec etwas weiter unten an, nämlich bei Spezifikationen. Diese Spezifikationen sind bereits PHP-Code, und das Toolset ermöglicht Code-Generierung anhand dieser Specs. Außerdem "erzwingt" die Nutzung von phpspec quasi automatisch Test-Driven Development.
  • Atoum: Ein Unit Testing-Framework aus Frankreich. Anders als ich behauptet habe, gibt es doch eine englische Dokumentation. Die Syntax mag einigen besser gefallen als die von PHPUnit, manche Prinzipien hält Atoum aber weniger strikt ein. Alternative Testing-Frameworks sind an sich nicht schlecht, aber wer bisher mit PHPUnit gut gefahren ist, braucht eigentlich nicht zu wechseln. Einen Blick ist Atoum dennoch wert.
  • Codeception: Das Framework vereinfacht sowohl Akzeptanz- als auch funktionale und Unit Tests. Die Syntax ist an BDD angelehnt und leicht verständlich. Für die funktionalen und Akzeptanz-Tests stehen mit dem WebGuy und dem TestGuy zwei Komponenten zur Verfügung, die ähnlich wie der DOM Crawler von Symfony2 oder Goutte eine Interaktion mit Webseiten ermöglichen, ohne dass ein Browser gestartet werden muss. Die Unit Test-Komponente (CodeGuy) bietet neben Mocks und Stubs eigentlich alles, was das Tester-Herz benötigt. Codeception ist ein sehr ambitioniertes und jetzt schon umfangreiches Projekt.

Nur kurz angerissen haben wir gesten außerdem:

Was fehlt? Kennt ihr noch mehr nützliche Tools, die das Testen erleichtern oder verbessern? Gern in die Kommentare oder per Twitter an mich: @mattsches.

Trackbacks

Jan Unger am : Jan Unger via Twitter

Vorschau anzeigen
RT @mattsches: Tester's Little Helpers: http://t.co/tzmcp3XRnq

Thomas Layh am : Thomas Layh via Twitter

Vorschau anzeigen
RT @mattsches blog update: Tester's Little Helpers http://t.co/QfdiEq4fZp Thx

Christian Münch am : Christian Münch via Twitter

Vorschau anzeigen
RT @mattsches: Tester's Little Helpers: http://t.co/tzmcp3XRnq

Fabian Blechschmidt am : Fabian Blechschmidt via Twitter

Vorschau anzeigen
“@mattsches: Tester's Little Helpers: http://t.co/cjIGyGtRoU” Das ist aber eine lange Liste… #unittests #testing

tolleiv am : tolleiv via Twitter

Vorschau anzeigen
RT @mattsches: Tester's Little Helpers: http://t.co/tzmcp3XRnq

Daniel K am : Daniel K via Twitter

Vorschau anzeigen
RT @mattsches: Tester's Little Helpers: http://t.co/tzmcp3XRnq

Ralf Lieser am : Ralf Lieser via Twitter

Vorschau anzeigen
RT @mattsches: Tester's Little Helpers: http://t.co/tzmcp3XRnq

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!