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 demTestGuy
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:
- Behat und Mink
- die sehr hilfreiche Magento-Extension EcomDev_PHPUnit
- Zend_Test_PHPUnit bzw. Zend\Test für das Zend Framework 1 bzw. 2
- WebTestCase für Symfony2 und Silex
- sowie den NyanCat-Reporter für PHPUnit
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.
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt