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.
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
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.
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.
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.
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)
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.
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"]
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.