Automatisches Testen von TDD mit PHP

Traditionelle testgetriebene Entwicklung kann zeitweise umständlich sein. Sie müssen das Schreiben von Code beenden, um Ihre Tests ausführen zu können. Glücklicherweise gibt es Lösungen, die die Möglichkeit bieten, Ihre Tests beim Codieren automatisch auszuführen. In diesem Lernprogramm erfahren Sie, wie Sie einen Ruby-Edelstein verwenden watchr, um Ihren Code zu überwachen und automatisch die entsprechenden Tests auszuführen, wenn Sie Ihre Arbeit speichern.


Schritt 1: Softwarevoraussetzungen

Jedes Tool, mit dem Sie schneller Feedback erhalten, ist ein wertvolles Gut.

In diesem Tutorial wird PHP für das Codebeispiel verwendet. Die Techniken sind jedoch für jede Sprache anwendbar, die ein CLI-Dienstprogramm für Komponententests bietet. Ruby ist erforderlich, da wir den watchr-Edelstein verwenden werden. Stellen Sie also sicher, dass Sie mit PHPUnit eine funktionierende Installation von Ruby und PHP haben.

Als nächstes stellen Sie sicher, dass Sie haben libnotify installiert, wenn Sie unter Linux sind; Benutzer von Windows und Mac OSX benötigen "Growl". Dieses Tutorial ist direkt auf Linux anwendbar, ich werde jedoch, soweit möglich, alternative Befehle und Einstellungen vorschlagen.

Nun ist es Zeit, den Juwel der Uhr zu installieren. Öffnen Sie eine Konsole und stellen Sie sicher, dass Sie sich in dem Ordner befinden, in dem Sie direkt ausführen können Juwel. Geben Sie den folgenden Befehl ein:

gem installieren watchr

Schritt 2: Technischer Hintergrund

Wenn eine Datei oder ein Ordner geändert wird, kann watchr eine Rückruffunktion auslösen.

Das watchr gem ist ein ausführbares Programm, das in Ruby geschrieben wurde. Es umfasst Funktionen, die im Dateisystem eines Betriebssystems gefunden werden, um die Möglichkeit zu bieten, Änderungen an einer bestimmten Datei oder einem bestimmten Ordner zu überwachen. Natürlich sind diese Dateisystemfunktionen für jedes Betriebssystem und jedes Dateisystem unterschiedlich.

watchr bietet eine einheitliche Anwendungsprogrammierschnittstelle (API) für alle Betriebssysteme. Unter Linux verwendet es inotify, die Dateisystem-Ereignisbibliothek des Kernels; Bei anderen Betriebssystemen wird die entsprechende Alternative verwendet. Wenn für das Betriebssystem aus irgendeinem Grund kein verfügbarer Ereignisdienst verfügbar ist, werden die überwachten Dateien oder Ordner regelmäßig von watchr abgefragt.

Wenn eine Datei oder ein Ordner geändert wird, kann watchr eine Rückruffunktion auslösen. Wir werden diese Funktion verwenden, um unsere Tests durchzuführen.


Schritt 3: Erstellen Sie ein PHP-Projekt

Unser Projekt ist ziemlich einfach. Replizieren Sie die einfache Verzeichnisstruktur, die in der folgenden Abbildung dargestellt ist:

In dem Nettuts.php Datei, fügen Sie den folgenden Code hinzu:

Fügen Sie anschließend den folgenden Code hinzu NettutsTest.php:

Objekt = neue Nettuts;  geschützte Funktion tearDown () ?>

Zu diesem Zeitpunkt ist die Testdatei einfach ein Skelett, und wie Sie in der Abbildung oben sehen können, bestehen die Tests erfolgreich.


Schritt 4: Erstellen Sie das erste watchr-Skript

Nun müssen wir eine Ruby-Datei im Ordner unseres Projekts erstellen. Lass es uns nennen autotest_watchr.rb. Als nächstes fügen Sie der Datei den folgenden Code hinzu:

watch ("Classes /(.*). php") do | match | run_test% Tests / # match [1] Test.php Ende

Automatisierte Tests sind IDE-unabhängig - ein großer Pluspunkt in meinem Buch.

Dieser Code verwendet die sehen Methode, um alle zu sehen .php Dateien in unserem Projekt Klassen Mappe. Wenn ein .php Dateiänderungen, das Betriebssystem gibt ein Ereignis aus und unser sehen Methode wird ausgelöst. Der Name des .php Die Datei wird (ohne die Erweiterung) an die Position eines Übereinstimmungsarrays von zurückgegeben 1. Wie bei jedem regulären Ausdruck werden Klammern verwendet, um eine Übereinstimmungsvariable anzugeben. In diesem Code verwenden wir sie in der Übereinstimmungsbedingung, um den Dateinamen abzurufen. Dann rufen wir die an Lauftest Methode mit dem Pfad des zusammengesetzten Testdateinamens.

Wir sollten uns auch unsere Testdateien ansehen. Fügen Sie der Ruby-Datei daher folgenden Code hinzu:

beobachten ("Tests /.* Test.php") do | match | run_test Übereinstimmung [0] Ende

Notiere dass der Spiel Array enthält den vollständigen Dateinamen an Position 0, und wir geben es direkt an die Lauftest Methode.


Schritt 5: Lassen Sie das Skript die Tests ausführen

Das Ruby-Skript ist so eingerichtet, dass es unsere .php Dateien, und jetzt müssen wir die implementieren Lauftest Methode. In unserem Fall möchten wir PHPUnit für die bestimmte Datei ausführen.

def run_test (file), es sei denn, File.exist? (file) setzt "# Datei ist nicht vorhanden". return end setzt "Running # file". result = 'phpunit # file' setzt das Ergebnisende

Wir stellen zunächst sicher, dass die Datei vorhanden ist, und kehren zurück, wenn dies nicht der Fall ist. Als Nächstes führen wir den Test mit PHPUnit aus und senden das Ergebnis an die Konsole. Lassen Sie uns unser watchr-Skript ausführen. Öffnen Sie Ihre Konsole, navigieren Sie zum Verzeichnis Ihres Projekts und führen Sie dann Folgendes aus:

watchr ./autotest_watchr.rb

Windows-Benutzer sollten "./" aus dem obigen Befehl weglassen.

Ändern Sie jetzt eine der .php Dateien (fügen Sie einfach eine leere Zeile am Ende der Datei hinzu), speichern Sie sie und beobachten Sie die Ausgabe in der Konsole. Sie sollten etwas ähnliches sehen, das unten gezeigt wird:

Tests / NettutsTest.php ausführen PHPUnit 3.6.0 von Sebastian Bergmann. F Zeit: 0 Sekunden, Speicher: 3.75Mb Es ist 1 Fehler aufgetreten: 1) Warnung In der Klasse "NettutsTest" wurden keine Tests gefunden. / usr / bin / phpunit: 46 FEHLER! Tests: 1, Assertions: 0, Fehler: 1.

Ja, wir haben noch keinen Test zum Laufen; Also lass uns einen Dummy-Test machen. Fügen Sie der Test-PHP-Datei den folgenden Code hinzu:

function testDummyPassingTest () $ this-> assertTrue (true); 

Führen Sie das Ruby-Skript erneut aus und Sie sollten Folgendes sehen:

Tests / NettutsTest.php ausführen PHPUnit 3.6.0 von Sebastian Bergmann… Zeit: 0 Sekunden, Speicher: 3.75MB OK (1 Test, 1 Assertion)

Schritt 6: Analysieren Sie die Testausgabe

Lassen Sie uns den Benutzer über den Benachrichtigungsmechanismus des Systems über die Testergebnisse informieren. Wir werden das ändern run_tests Methode zum Auslösen einer Methode, aufgerufen benachrichtigen. Unten ist der modifizierte run_tests:

def run_tests (Datei), es sei denn, File.exist? (Datei) setzt "# Datei ist nicht vorhanden". Rückgabewert setzt "Laufende # Datei" Ergebnis = 'Phpunit # Datei' setzt Ergebnis wenn Ergebnis.Match (/ OK /) Benachrichtigen Sie "# file", "Tests bestanden erfolgreich", "success.png", Ende 2000

Der Name der Bilddatei, Erfolg.png, zeigt auf das Bild, das Sie im Benachrichtigungsbereich anzeigen möchten. Dieses Bild ist in diesem Tutorial nicht enthalten. Sie müssen also Ihr eigenes finden. Nun schreiben wir die benachrichtigen Methode:

def notify title, msg, img, show_time images_dir = "~ / .autotest / images" system "notify-send '# title" # msg' -i # images_dir / # img -t #  show_time "Ende

Mac OSX- und Windows-Benutzer: Ersetzen Sie die benachrichtigen senden Befehl mit der entsprechenden Growl-Alternative. Ändern Sie etwas in Ihrer Test- oder Codedatei, damit der Test noch besteht. Speichern Sie die geänderte PHP-Datei und beobachten Sie, wie die Magie passiert. Unten sehen Sie ein Bild des Ergebnisses auf meinem System:

Als nächstes müssen wir die Fehler auffangen. Der folgende Code fügt ein paar Zeilen hinzu run_tests:

def run_tests (Datei), es sei denn, File.exist? (Datei) setzt "# Datei ist nicht vorhanden". Rückgabewert setzt "Laufende # Datei" Ergebnis = 'Phpunit # Datei' setzt Ergebnis wenn Ergebnis.Match (/ OK /) Benachrichtigen Sie "# file", "Tests bestanden erfolgreich", "success.png", 2000 elsif result.match (/ FAILURES \! /) Notify_failed-Datei, Ergebnisende endet

Fügen wir auch das hinzu notify_failed Methode zur Datei:

def notify_failed cmd, Ergebnis failed_examples = result.scan (/ failure: \ n \ n (. *) \ n /) benachrichtigen "# cmd", fail_examples [0], "failure.png", 6000 end

Ändern Sie eine Ihrer PHP-Dateien, damit der Test fehlschlägt. Speichern Sie die geänderte Datei. Beachten Sie die Benachrichtigungsmeldung. Es enthält den Namen des ersten fehlgeschlagenen Tests. Dieser Name wird vom regulären Ausdruck in der Methode ausgewählt notify_failed, was die PHPUnit-Ausgabe analysiert.


Schritt 7: Löschen Sie die Konsole vor jedem Testlauf

Fügen Sie Ihrem Ruby-Skript die folgende Methode hinzu, und rufen Sie sie unbedingt im Verzeichnis auf Lauftest Methode. Der Code sollte unter Linux und Mac OSX funktionieren, möglicherweise müssen Sie jedoch einige Nachforschungen für Windows durchführen.

def clear_console setzt das Ende der #clear-Konsole "\ e [H \ e [2J"]

Fazit

Wenn Sie mit TDD programmieren, ist jedes Tool, das Ihnen hilft, schneller Feedback zu erhalten, ein wertvolles Gut. Meine Kollegen verwenden ähnliche Skripte mit watchr oder Alternativen (einige werden herum geschrieben) fs_event unter MacOS). Unnötig zu sagen, dass wir jetzt verwöhnt sind und uns nicht vorstellen können, etwas zu entwickeln, ohne automatisch Tests auszuführen.

Automatisierte Tests sind IDE-unabhängig - ein großer Pluspunkt in meinem Buch. Zu viele IDEs zwingen Sie dazu, ein bestimmtes Testframework zu verwenden, und ich kann nicht mit Remote-Tests beginnen. Ich ziehe es vor, solche Skripte täglich zu verwenden, und empfehle sie sicherlich jedem agilen Softwareentwickler.