Im ersten Teil dieser Serie haben wir uns ausführlich mit Testmethoden befasst und einige Fälle gegeben, warum es für uns von Vorteil ist, in unseren WordPress-Projekten zu arbeiten. Wir haben uns auch die Zeit genommen, PHPUnit und die WordPress-Tests einzurichten, um mit der Entwicklung unseres ersten testbaren Plugins zu beginnen.
In diesem abschließenden Artikel werden wir eine Methodik für Komponententests definieren, mit der Integration in unsere Arbeit beginnen und ein voll funktionsfähiges (wenn auch einfaches) Plugin nutzen, das auch ein paar Tests enthält, um sicherzustellen, dass es genau funktioniert wie erwartet.
Beim Testen gibt es im Allgemeinen zwei Möglichkeiten, dies zu tun:
Nach meiner Erfahrung ist der erste Ansatz immer besser. Zugegeben, dies ist im Kontext einer bereits existierenden Anwendung praktisch unmöglich, aber wenn Sie von vorne anfangen - was wir sind -, ist dies ein besserer Ansatz weiß, wie es funktioniert Daher kann es äußerst schwierig sein, Tests zu schreiben, die die Anwendung dehnen, wenn Sie wissen, wie sie funktionieren soll.
Zu diesem Zweck finde ich es besser, die Tests zu schreiben zuerst. Auf diese Weise umfassen Ihre Tests nicht nur die Art und Weise, wie das Programm ist soll funktioniert, wird aber auch zu einer Form der Dokumentation, die zeigt, welche Funktionalität beabsichtigt ist, und führt letztendlich zu einem Fehler, wenn die Funktionalität nicht ordnungsgemäß funktioniert.
In diesem Sinne werden wir mit dieser einfachen Methode aufbauen:
Als Auffrischung wird unser Plugin dem Besucher eine spezielle Begrüßungsnachricht übermitteln, die darauf basiert, ob er von Google oder Twitter auf die Website geklickt hat. Wir werden dies auch so schreiben, dass es einfacher ist, mit zusätzlichen Services zu erweitern, falls Sie dies in der Zukunft wünschen.
An diesem Punkt ist es an der Zeit, Code zu schreiben. Im Gegensatz zu den meisten Projekten werden wir jedoch noch nicht in WordPress-spezifischen Code einsteigen. Stattdessen werden wir unsere Unit-Test-Klasse unterdrücken. Wenn Sie das Verzeichnis Ihres Plugins basierend auf dem, was wir im ersten Beitrag geteilt haben, oder wie wir es auf GitHub konfiguriert haben, strukturiert hat, sollten Sie ein hello_reader_tests.php Datei in Ihrem Tests / Wordpress-Tests Verzeichnis. Sie müssen dieser Organisation natürlich nicht folgen, aber sie wird im weiteren Verlauf des Projekts hilfreich sein.
Lassen Sie uns die Unit-Test-Klasse austesten:
required_once ('… /… /plugin.php'); Die Klasse Hello_Reader_Tests erweitert die WP_UnitTestCase // Klasse
Versuchen Sie nun, den Test mit der PHP-Einheit vom Terminal aus auszuführen. Unter der Annahme, dass Sie ein PHP-Gerät von Ihrer lokalen MAMP-Installation aus ausführen, sollten Sie Folgendes eingeben können:
$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit ./hello_reader_tests.php
An diesem Punkt sollte ein Fehler angezeigt werden:
Das ist gut! Dies bedeutet, dass PHPUnit installiert ist und ausgeführt wird und dass Ihr WordPress Testing-Framework einsatzbereit ist. Der Test ist fehlgeschlagen, weil wir noch keine Tests geschrieben haben. Lass uns damit anfangen.
Lassen Sie uns zunächst einen Test schreiben, um sicherzustellen, dass unser Plugin initialisiert, instanziiert und zum Testen bereit ist. Erinnern Sie sich vorher im ersten Artikel, dass wir einen Verweis auf die Instanz von Hello Reader in PHP gespeichert haben $ GLOBALS
Array. So greifen wir über das Testframework auf diese Instanz zu. Lassen Sie uns also unseren Unit-Test so aktualisieren, dass er wie folgt aussieht:
Beachten Sie, dass ich aus Platzgründen Codekommentare weglasse, aber das vollständig kommentierte Plugin und die Tests werden auf GitHub verfügbar sein.
required_once ('… /… /plugin.php'); Die Klasse Hello_Reader_Tests erweitert WP_UnitTestCase private $ plugin; function setUp () parent :: setUp (); $ this-> plugin = $ GLOBALS ['Hallo-Leser']; // Setup-Funktion beenden testPluginInitialization () $ this-> assertFalse (null == $ this-> plugin); // end testPluginInitialization // end class
Wir haben oben einen Verweis auf die Instanz des Plugins eingerichtet, damit wir während unserer Unit-Tests darauf zugreifen können. Wir benutzen die Konfiguration
Methode, um den Verweis auf das Plugin abzurufen $ GLOBALS
. Beachten Sie jedoch, dass wir eine andere Funktion eingeführt haben testPluginInitialization
. Diese Funktion überprüft, ob die Referenz, die wir in eingerichtet haben Konfiguration
Methode ist nicht null.
Wenn Sie die Tests erneut ausführen, sollten Sie jetzt einen bestandenen Test erhalten und Ihr Terminal sollte folgendermaßen aussehen:
Es gibt hier einen wichtigen Imbiss: Beachten Sie, dass die oben beschriebene einzelne Funktion einen klaren Zweck hat: um sicherzustellen, dass das Plugin ordnungsgemäß initialisiert wurde. Der Funktionsname ist eindeutig und enthält eine einzige Assert-Anweisung. Dies ist eine großartige Möglichkeit, unsere verbleibenden Tests zu modellieren, da sie das Auffinden von Fehlern erleichtert. Stellen Sie sich das so vor: Wenn Sie mehrere Assert-Anweisungen in eine einzige Funktion aufnehmen, ist es schwierig zu bestimmen, welche Assert-Anweisung fehlschlägt.
Nachdem wir nun das Schreiben von Komponententests, das Durchführen von Komponententests und das Bestimmen oder Fehlschlagen von Tests kennengelernt haben, beginnen wir mit der Implementierung der Funktionalität für das Plugin. Zunächst müssen wir einen Filter für den Inhalt einrichten, da wir Text an den Anfang des Inhalts anhängen. Lassen Sie uns zunächst den Test mit der Methodik, die wir zuvor in diesem Artikel definiert haben, schreiben.
In diesem Test wird geprüft, ob wir an den ersten Teil des Posts einen bestimmten Satz von Texten angehängt haben:
function testAddWelcomeMessage () $ this-> assertEquals ('TEST CONTENT', $ this-> plugin-> add_welcome_message ('Dies ist ein Beispiel für einen Post-Inhalt. Dies simuliert, dass WordPress beim Anzeigen eines Blog-Posts zurückkehrt.'), 'add_welcome_message ( ) fügt eine Begrüßungsnachricht an den Beitragsinhalt an. '); // testAddWelcomeMessage beenden
Wenn Sie den Test genau so ausführen, wie er ist, schlägt er auch nicht fehl. Stattdessen gibt PHPUnit einen schwerwiegenden Fehler zurück, da die Methode nicht im Plugin definiert ist. Fügen wir das jetzt hinzu. Aktualisieren Sie das Plugin folgendermaßen:
class Hello_Reader function __construct () add_filter ('the_content', array (& $ this, 'add_welcome_message')); // Endkonstruktor public function add_welcome_message ($ content) // end add_welcome_message // endklasse
Versuchen Sie jetzt, den Test auszuführen. Der Test wird nicht bombardieren, aber Sie sollten tatsächlich einen Fehler sehen und eine klare Meldung darüber, warum der Test fehlgeschlagen ist:
1) Hello_Reader_Tests :: testAddWelcomeMessage add_welcome_message () hängt eine Willkommensnachricht an den Beitragsinhalt an. Fehler beim Bestätigen, dass Null mit dem erwarteten "TESTINHALT" übereinstimmt
Deshalb wollen wir diesen Test gemäß unserer Methodik bestehen. Dazu müssen wir sicherstellen, dass der Post-Inhalt die Textzeichenfolge enthält - in diesem Fall 'Testinhalt
', um es passieren zu lassen. Also lass es uns versuchen. Aktualisieren Sie die entsprechende Funktion im Plugin, um den String vor dem Inhalt anzufügen:
öffentliche Funktion add_welcome_message ($ content) return 'TEST CONTENT'. $ content; // add_welcome_message beenden
Und wieder führen wir den Test erneut aus, nur um zu sehen, dass er fehlschlägt. Wenn Sie unseren Test bemerken, liegt dies daran, dass er unseren Inhalt sehen möchte gleich das 'Testinhalt
String. Stattdessen müssen wir sicherstellen, dass die Zeichenfolge mit dem Inhalt beginnt. Das bedeutet, dass wir unseren Test aktualisieren müssen. Zum Glück hat PHPUnit eine assertContains-Funktion. Lassen Sie uns also unseren Code aktualisieren, um ihn zu verwenden:
function testAddWelcomeMessage () $ this-> assertContains ('TEST CONTENT', $ this-> plugin-> add_welcome_message ('Dies ist ein Beispiel für einen Post-Inhalt. Dies simuliert, dass WordPress beim Anzeigen eines Blog-Posts zurückkehrt.'), 'add_welcome_message ( ) fügt eine Begrüßungsnachricht an den Beitragsinhalt an. '); // testAddWelcomeMessage beenden
Wiederholen Sie den Test erneut und Sie sollten sehen, dass der Test jetzt bestanden ist. Genial! Jetzt müssen wir angepasste Nachrichten für Personen, die von Twitter und von Google kommen, schreiben.
Es gibt verschiedene Möglichkeiten, um zu prüfen, wie ein Benutzer auf einer bestimmten Seite angekommen ist. Manchmal können wir die Werte im überprüfen $ _GET
Array, manchmal können wir das abfragen $ _SERVER
Array, oder manchmal können wir die Sitzung eines Benutzers überprüfen. Für die Zwecke dieses Beispiels suchen wir nach "twitter.com", das im Internet gefunden werden kann $ _SERVER ['HTTP_REQUEST']
. Ich sage das nur, damit ihr Jungs folgen könnt, was wir im Code tun.
Im Allgemeinen also die add_welcome_message
Überprüfen Sie, ob die Anfrage von Twitter stammt, und passen Sie die Nachricht entsprechend an. Da wir alle Funktionen testen, können wir eine Funktion schreiben, die beurteilt, ob die Anfrage von Twitter stammt. Schreiben wir also einen neuen Test:
Im Plugin:
public function is_from_twitter () // Ende is_from_twitter
In der Prüfung:
Funktion testIsComingFromTwitter () $ _SERVER ['HTTP_REFERER'] = 'http://twitter.com'; $ this-> assertTrue ($ this-> plugin-> is_from_twitter (), 'is_from_twitter () gibt true zurück, wenn die verweisende Site Twitter ist.'); // end testIsComingFromTwitter
Wir fälschen das offensichtlich HTTP_REFERER
Wert, aber das ist okay für die Zwecke dieses Beispiels. Es bleibt immer noch der Punkt: Führen Sie den Test aus, der Test schlägt fehl, und daher müssen wir die Funktion im Plugin implementieren, damit der Test bestanden werden kann:
public function is_from_twitter () return strpos ($ _SERVER ['HTTP_REFERER'], 'twitter.com')> 0; // Ende is_from_twitter
Das erneute Ausführen des Tests sollte nun zu einem bestandenen Test führen. Aber warten Sie - wir müssen komplett sein. Stellen Sie sicher, dass wir einen Test ausführen, um zu überprüfen, ob diese Funktion fehlschlägt, wenn der Referrer ist nicht von Twitter.
Funktion testIsNotComingFromTwitter () // Spoofing des HTTP_REFERER für die Zwecke dieses Tests und des zugehörigen Blogposts $ _SERVER ['HTTP_REFERER'] = 'http://facebook.com'; $ this-> assertFalse ($ this-> plugin-> is_from_twitter (), 'is_from_twitter () gibt true zurück, wenn die verweisende Site Twitter ist.'); // end testIsNotComingFromTwitter
Beachten Sie, dass wir das aktualisiert haben HTTP_REFERER
und wir haben uns verändert assertTrue
zu assertFalse
. Wenn alles andere erlaubt ist, führen Sie die Tests durch und sie sollten bestehen.
Die Bereitstellung einer benutzerdefinierten Nachricht für Google erfordert dasselbe, was wir für Twitter gemacht haben, d HTTP_REFERER
und geben Sie dann für die Hilfsfunktion true oder false zurück. Um nicht redundant zu klingen, halte ich diesen Abschnitt so kurz wie möglich. Es sind die gleichen Schritte wie bei Twitter zu befolgen.
Zunächst stecken wir die Hilfsfunktion im Plugin aus:
öffentliche Funktion is_from_google () // Ende is_from_google
Dann testen wir den Test:
Funktion testIsComingFromGoogle () $ _SERVER ['HTTP_REFERER'] = 'http://google.com'; $ this-> assertTrue ($ this-> plugin-> is_from_google (), 'is_from_google () gibt true zurück, wenn die verweisende Site Google ist.'); // end testIsComingFromGoogle
Wenn der Test so ausgeführt wird, wie er jetzt ist, führt dies zu einem Fehler. Also lassen Sie uns das implementieren is_from_google ()
Funktion:
public function is_from_google () return strpos ($ _SERVER ['HTTP_REFERER'], 'google.com')> 0; // Ende is_from_twitter
Und jetzt sollte der Test bestehen. Aber noch einmal, wir müssen vollständig sein, schreiben wir also den Fehlertest, um anzunehmen, dass die Funktion nicht wahr zurückgibt, wenn Benutzer von woanders kommen:
Funktion testIsNotComingFromGoogle () // Spoofing des HTTP_REFERER für die Zwecke dieses Tests und des zugehörigen Blogposts $ _SERVER ['HTTP_REFERER'] = 'http://facebook.com'; $ this-> assertFalse ($ this-> plugin-> is_from_google (), 'is_from_google () gibt true zurück, wenn die verweisende Site Google ist.'); // end testIsNotComingFromGoogle
Zum Schluss führen Sie Ihre Tests durch. Wenn alles andere erlaubt ist, sollten Sie sechs bestandene Tests bestehen.
An diesem Punkt haben wir alles, was wir benötigen, um unseren Benutzern benutzerdefinierte Begrüßungsnachrichten anzuzeigen. Die einzige Sache ist, dass wir unseren ersten Test, der auf "TEST CONTENT" überprüft, umgestalten müssen. Jetzt müssen wir Tests für die folgenden Fälle einführen:
Entfernen wir also den zuvor erstellten Test testAddWelcomeMessage
anstelle von drei neuen Tests.
Zuerst fügen wir einen Test hinzu, der die Begrüßungsnachricht von Twitter überprüft.
Im Plugin reduzieren wir die add_welcome_message
zu diesem:
öffentliche Funktion add_welcome_message ($ content) return $ content; // add_welcome_message beenden
Und wir werden zuerst den Twitter-Test hinzufügen:
function testDisplayTwitterWelcome () // Spoof für HTTP_REFERER für Twitter $ _SERVER ['HTTP_REFERER'] = 'http://twitter.com'; $ this-> assertContains ('Willkommen bei Twitter!', $ this-> plugin-> add_welcome_message ('Dies ist ein Beispiel für einen Post-Inhalt. Dies simuliert, dass WordPress beim Anzeigen eines Blog-Posts zurückkehren würde.'), 'add_welcome_message () hängt welcome an Nachricht an den Post-Inhalt. '); // testDisplayTwitterWelcome beenden
An diesem Punkt ist dies ein alter Hut, oder? Führen Sie es aus, der Test schlägt fehl. Implementieren Sie die add_welcome_message
so aussehen:
öffentliche Funktion add_welcome_message ($ content) if ($ this-> is_from_twitter ()) $ content = 'Willkommen von Twitter!' . $ content; // Ende wenn return $ content; // add_welcome_message beenden
Führen Sie es erneut aus und es wird passieren. Als nächstes ist der Google-Test:
function testDisplayGoogleWelcome () // Spoof für HTTP_REFERER für Google $ _SERVER ['HTTP_REFERER'] = 'http://google.com'; $ this-> assertContains ('Willkommen bei Google!', $ this-> plugin-> add_welcome_message ('Dies ist ein Beispiel für einen Post-Inhalt. Dies simuliert, dass WordPress beim Anzeigen eines Blog-Posts zurückkehren würde.'), 'add_welcome_message () hängt welcome an Nachricht an den Post-Inhalt. '); // testDisplayGoogleWelcome beenden
Führen Sie den Test aus, lassen Sie ihn fehlschlagen und aktualisieren Sie dann den add_welcome_message
im Plugin, um eine Überprüfung mit der zuvor beschriebenen Hilfsfunktion zu enthalten:
öffentliche Funktion add_welcome_message ($ content) if ($ this-> is_from_twitter ()) $ content = 'Willkommen von Twitter!' . $ content; else if ($ this-> is_from_google ()) $ content = 'Willkommen bei Google!' . $ content; // Ende wenn return $ content; // add_welcome_message beenden
Zu diesem Zeitpunkt sollten Sie über ein voll funktionsfähiges Plugin verfügen, das sieben Unit-Tests bestanden hat!
Wie Sie sehen, führt Unit Testing zu einem zusätzlichen Entwicklungsstand, der sich jedoch in wartbarem, gut organisiertem und testbarem Code erheblich auszahlt. Wenn Ihre Anwendung immer größer wird, können Sie kontinuierlich Tests durchführen, um zu überprüfen, ob Ihre Projekte wie erwartet funktionieren. Dies ist natürlich nur ein kleines Beispiel für die Funktionsweise von Komponententests. Die Anwendung dieser Praktiken kann sich bei viel größeren und / oder komplizierten Projekten auszahlen.
Schließlich finden Sie dieses Plugin, die WordPress-Tests und die Hello-Reader-Unit-Tests, die vollständig auf GitHub kommentiert sind.