Continuous Testing mit PHP?
Continuous Integration ist einigen eventuell ein Begriff. Dabei geht es darum, einen Server zu haben der bei jedem Commit (bzw. Push) des Quelltextes Dinge ausführt wie Unit Tests, Akzeptanz-Tests, PHP Lint, CodeSniffer oder auch ein Deployment auf einen Test-Rechner. Wenn man nun also häufig pushed kann man sicher sein dass (bei genügend guten Tests) die Software läuft und nichts kaputtgegangen ist. Und wenn doch, weiß man wann es ungefähr passiert ist.
Continuous Testing geht nun noch einen Schritt weiter. Hierbei werden nicht erst bei jedem Push die Unit-Tests gestartet sondern bei jedem Abspeichern einer Datei auf dem Entwicklungsrechner. Da gibt es nun mehrere Ansätze wie man das erreichen kann. Vielleicht kennt ihr andere und bessere Tools, um kontinuierlich auf der Workstation zu testen.
Möglichkeit 1: Die IDE bietet einen “On-Save” Einstellung, wo man einen Befehl eingeben kann der ausgeführt wird sobald die IDE eine Datei abspeichert. Dort trägt man dann sein Shell-Script ein das die Unit-Tests startet. in PHPStorm kann man zum Beispiel auch einstellen dass nach 15 Sekunden IDLE automatisch gespeichert wird, oder wenn PHPStorm den Fokus verliert (weil man gerade in den Browser wechselt). Ein Garant für häufiges Testen.
Möglichkeit 2: Man nutzt Eclipse und installiert das Plugin PTI, um PHPUnit, PHP_CodeSniffer, PHP_Depend und PHP Copy&Paste Detector direkt in Eclipse zu integrieren. In PHPStorm ist eine PHPUnit-Integration direkt eingebaut und man kann dann direkt die aktuelle Klasse, Methode, die Datei oder das ganze Verzeichnis testen lassen. Ergebnisse werden in beiden Fällen direkt in der IDE angezeigt. Ich glaube ähnliches gibt es auch in NetBeans.
Möglichkeit 3: Ein kleines externes Programm beobachtet das Projektverzeichnis. Sobald sich eine Datei geändert hat werden die Tests ausgeführt. Aus der Ruby-Welt gibt es da Auto-Test und Watchr, die aber auch für PHP-Projekte benutzt werden können. In PHP geschrieben habe ich so etwas noch nicht gefunden, es müßte aber möglich sein. Falls es Unterstützung für die Inotify-Extension gibt geht es eventbasiert, ansonsten muss man eine Schleife laufen lassen die die filemtime() aller Dateien beobachtet.
Ein interessantes Linux-Tool ist incron, das ähnlich wie das normale cron Befehle ausführen kann. Im Gegensatz zu cron führt incron jedoch Aktionen nicht zeitlich gesteuert aus sondern wenn es inotify-Events vom Dateisystem gibt. Man kann damit erreichen dass beim Erstellen, Ändern oder Löschen einer Datei in unserem Projektordner Befehl X ausgeführt wird.
Bei diesen externen Tools muss natürlich auch eine sichtbare Ausgabe erfolgen. Dazu kann man auf Workstations natürlich einen Sound abspielen, oder gleich fertige Dinge wie Growl nutzen, die einem diese schönen kleinen Kästen rechts unten hochfahren lassen.
Wer von euch testet kontinuierlich (automatisiert) auf seiner Workstation?