Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Creative Coding
Code

Der Anfängerleitfaden zum Komponententest: Erstellen eines testbaren Plugins

by
Length:LongLanguages:

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Im ersten Teil dieser Serie haben wir uns die Testmethoden auf hohem Niveau angesehen und einige Argumente dafür gegeben, warum es für uns von Vorteil ist, mit unseren WordPress-Projekten zu beginnen. Wir haben uns auch Zeit genommen, PHPUnit und die WordPress-Tests einzurichten, um mit dem Aufbau unseres ersten testbaren Plugins zu beginnen.

In diesem letzten Artikel werden wir eine Methodik für Komponententests definieren, beginnen, sie in unsere Arbeit zu integrieren, und mit einem voll funktionsfähigen (wenn auch einfachen) Plugin fortfahren, das auch eine kleine Anzahl von Tests enthält, um sicherzustellen, dass es genau funktioniert wie erwartet.


Eine Unit-Test-Methodik

Wenn es um Tests geht, gibt es im Allgemeinen zwei Möglichkeiten:

  • Schreiben Sie Ihre Tests und schreiben Sie Code, damit Ihre Tests bestanden werden
  • Schreiben Sie Ihren Code und schreiben Sie Tests, die bestanden haben

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 Grund auf neu beginnen - was wir sind -, ist es ein besserer Ansatz und hier ist der Grund: Sobald Sie eine Anwendung geschrieben haben, werden Sie weiß wie es funktioniert. Daher kann es extrem schwierig sein, Tests zu schreiben, die die Anwendung dehnen, wenn Sie wissen, wie sie funktionieren soll.

Zu diesem Zweck finde ich es besser, zuerst die Tests zu schreiben. Auf diese Weise enthalten Ihre Tests nicht nur die Art und Weise, wie das Programm funktionieren soll, sondern es wird auch zu einer Art Dokumentation, die zeigt, welche Funktionalität beabsichtigt ist und letztendlich zu einem Fehler führt, wenn die Funktionalität nicht ordnungsgemäß funktioniert.

In diesem Sinne werden wir mit dieser einfachen Methode bauen:

  • Schreiben Sie einen Test und führen Sie ihn aus. Es wird offensichtlich fehlschlagen.
  • Schreiben Sie Code, der versucht, den Test zu bestehen.
  • Wenn der Test besteht, gehen wir zur nächsten Funktion über; Andernfalls wiederholen wir den Prozess, bis er erfolgreich ist.

Als Auffrischung wird unser Plugin dem Besucher eine spezielle Begrüßungsnachricht geben, basierend darauf, ob er von Google oder Twitter auf die Website geklickt hat. Wir werden das auch so schreiben, dass es einfacher ist, mit zusätzlichen Services zu erweitern, wenn Sie dies in Zukunft tun möchten.


Erstellen eines testbaren Plugins

An diesem Punkt ist es Zeit, etwas Code zu schreiben; Im Gegensatz zu den meisten anderen Projekten werden wir jedoch noch nicht in den WordPress-spezifischen Code springen. Stattdessen werden wir unsere Komponententestklasse ausschließen. Wenn Sie das Verzeichnis Ihres Plugins basierend auf dem, was wir im ersten Post geteilt haben oder wie wir es auf GitHub konfiguriert haben, strukturiert haben, dann sollten Sie eine hello_reader_tests.php-Datei im Verzeichnis tests/wordpress-tests finden. Natürlich müssen Sie dieser Organisation nicht folgen, aber das wird uns helfen, wenn wir uns durch das Projekt bewegen.

Lassen Sie uns die Einheitenklasse testen:

Versuchen Sie nun, den Test mit Hilfe des PHP-Geräts vom Terminal aus auszuführen. Angenommen, Sie führen die PHP-Einheit von Ihrer lokalen MAMP-Installation aus, sollten Sie Folgendes eingeben können:

$/Applications/MAMP/bin/php/php5.3.6/bin/phpunit ./hello_reader_tests.php

An diesem Punkt sollten Sie einen Fehler sehen:

Failing Tests

Das ist gut! Es bedeutet, dass PHPUnit installiert ist und läuft und dass Ihr WordPress Testing-Framework bereit ist. Der Test ist gescheitert, weil wir keine Tests geschrieben haben. Lass uns damit beginnen.

Unser erster Test

Lassen Sie uns zunächst einen Test schreiben, um sicherzustellen, dass unser Plugin initialisiert, instanziiert und testbereit ist. Erinnern Sie sich früher im ersten Artikel daran, dass wir einen Verweis auf die Instanz von Hello Reader im Array PHP $GLOBALS gespeichert haben. Auf diese Weise greifen wir über das Testframework auf diese Instanz zu. Lassen Sie uns unseren Komponententest so aktualisieren, dass er wie folgt aussieht:

Beachten Sie, dass ich aus Platzgründen Code-Kommentare weglasse, aber das vollständig kommentierte Plugin und die Tests werden auf GitHub verfügbar sein.

Oben haben wir einen Verweis auf die Instanz des Plugins eingerichtet, damit wir während unserer Unit-Tests darauf zugreifen können. Wir verwenden die Methode setUp, um den Verweis auf das Plugin von $GLOBALS zu erhalten. Beachten Sie jedoch, dass wir eine weitere Funktion namens testPluginInitialization eingeführt haben. Diese Funktion überprüft, ob die Referenz, die wir in der Methode setUp eingerichtet haben, nicht null ist.

Wenn Sie die Tests erneut ausführen, sollten Sie jetzt einen bestandenen Test erhalten und Ihr Terminal sollte wie folgt aussehen:

Passing Tests

Es gibt hier einen wichtigen Aspekt: Beachten Sie, dass die einzelne Funktion, die wir oben zur Verfügung gestellt haben, einen klaren Zweck hat: zu überprüfen, ob das Plugin richtig initialisiert wurde. Der Funktionsname ist eindeutig und enthält eine einzige assert-Anweisung. Dies ist eine großartige Möglichkeit, unsere verbleibenden Tests vor allem zu modellieren, da es das Auffinden von Fehlern beim Auftreten erleichtert. Denken Sie darüber nach: Wenn Sie eine Anzahl verschiedener assert-Anweisungen in eine einzelne Funktion einfügen, wird es schwierig zu bestimmen, welche assert-Anweisung fehlschlägt.

Die erste Funktion

Nachdem wir nun gelernt haben, Unit-Tests zu schreiben, Unit-Tests durchzuführen und zu bewerten, wie sie bestanden werden oder wie sie ausfallen, beginnen wir mit der Implementierung von Funktionen für das Plugin. Als erstes müssen wir einen Filter für den Inhalt einrichten, da wir Text an den Anfang des Inhalts anhängen werden. Im Anschluss an die Methodik, die wir zuvor in diesem Artikel definiert haben, schreiben wir zuerst unseren Test.

Dieser spezielle Test wird nachsehen, ob wir einen bestimmten Satz Text an den ersten Teil des Posts angehängt haben:

Wenn Sie den Test genau so ausführen, wie er ist, wird er nicht einmal fehlschlagen - stattdessen gibt PHPUnit einen schwerwiegenden Fehler zurück, weil die Methode nicht im Plugin definiert ist. Lass uns das jetzt hinzufügen. Aktualisieren Sie das Plugin wie folgt:

Versuchen Sie nun, den Test auszuführen. Der Test wird nicht bombardieren, aber Sie sollten tatsächlich einen Fehler zusammen mit einer klaren Meldung sehen, warum der Test fehlgeschlagen ist:

Entsprechend unserer Methodik wollen wir diesen Test bestehen lassen. Um dies zu erreichen, müssen wir sicherstellen, dass der Post-Inhalt die Textzeichenfolge enthält - in diesem Fall "TEST CONTENT", um ihn zu bestehen. Also lass es uns versuchen. Aktualisieren Sie die entsprechende Funktion im Plugin, um die Zeichenfolge vor dem Inhalt anzuhängen:

Und wieder führen wir den Test erneut aus, nur um zu sehen, dass es fehlschlägt. Wenn Sie unseren Test bemerken, ist dies darauf zurückzuführen, dass unser Inhalt der Zeichenfolge "TEST CONTENT" entspricht. Stattdessen müssen wir sicherstellen, dass die Zeichenfolge auf dem Inhalt beginnt. Dies bedeutet, dass wir unseren Test aktualisieren müssen. Glücklicherweise hat PHPUnit eine assertContains-Funktion. Also lasst uns unseren Code aktualisieren, um ihn zu benutzen:

Führen Sie den Test erneut aus, und Sie sollten sehen, dass der Test jetzt bestanden wird. Genial! Jetzt müssen wir benutzerdefinierte Nachrichten für Leute schreiben, die von Twitter kommen und Leute, die von Google kommen.

Begrüßung unserer Twitter-Besucher

Es gibt eine Reihe verschiedener Möglichkeiten, mit denen wir überprüfen können, wie ein Benutzer auf einer bestimmten Seite angekommen ist. Manchmal können wir die Werte im Array $_GET überprüfen, manchmal können wir das Array $_SERVER abfragen, oder manchmal können wir die Sitzung eines Benutzers überprüfen. Für dieses Beispiel suchen wir nach 'twitter.com' im $_SERVER ['HTTP_REQUEST'] gefunden werden. Ich sage das nur, damit ihr mit dem, was wir im Code machen, mithalten könnt.

Im Allgemeinen sollte die Nachricht add_welcome_message prüfen, ob die Anfrage von Twitter stammt und die Nachricht dann entsprechend anpassen. Da wir jede Funktion einzeln testen, können wir eine Funktion schreiben, die auswerten kann, ob die Anfrage von Twitter kommt. Lass uns einen neuen Test schreiben:

Im Plugin:

In der Prüfung:

Wir spionieren offensichtlich den HTTP_REFERER-Wert, aber das ist für dieses Beispiel okay. Der Punkt bleibt immer noch bestehen: Führen Sie den Test, es wird fehlschlagen, und so müssen wir die Funktion im Plugin implementieren, um es passieren zu lassen:

Die Wiederholung des Tests sollte jetzt zu einem bestandenen Test führen. Aber warte - wir müssen vollständig sein. Lassen Sie uns sicherstellen, dass wir einen Test ausführen, um zu verifizieren, dass diese Funktion fehlschlägt, wenn der Referrer nicht von Twitter stammt.

Beachten Sie, dass wir den HTTP_REFERER aktualisiert haben und assertTrue in assertFalse geändert haben. Wenn alles andere erlaubt ist, führen Sie die Tests aus und sie sollten bestehen.

Das Gleiche für Google wiederholen

Das Bereitstellen einer angepassten Nachricht für Google erfordert dasselbe, was wir für Twitter getan haben, das heißt, den HTTP_REFERER vortäuschen und dann für die Hilfsfunktion wahr oder falsch zurückgeben. Um also überflüssig zu bleiben, werde ich diesen Abschnitt so kurz wie möglich halten. Die gleichen Schritte müssen wie bei Twitter befolgt werden.

Zuerst stubben wir die Hilfsfunktion im Plugin aus:

Dann machen wir den Test aus:

Wenn der Test gerade ausgeführt wird, führt dies zu einem Fehler. Also implementieren wir die is_from_google() Funktion:

Und nun sollte der Test bestanden werden. Aber noch einmal, wir müssen vollständig sein, also schreiben wir den Fehlertest, um davon auszugehen, dass die Funktion nicht wahr wird, wenn Benutzer von woanders kommen:

Führen Sie schließlich Ihre Tests aus. Wenn alles andere korrekt ist, sollten Sie sechs bestandene Tests bestehen.

Alles zusammen ziehen

An diesem Punkt haben wir alles, was wir brauchen, um unseren Benutzern benutzerdefinierte Begrüßungsnachrichten anzuzeigen. Die einzige Sache ist, dass wir unseren ersten Test, der nach "TEST INHALT" sucht, umgestalten müssen. Jetzt müssen wir Tests für folgende Fälle einführen:

  • Wenn der Nutzer von Twitter kommt, sagen wir "Willkommen von Twitter!"
  • Wenn der Nutzer von Google kommt, sagen wir "Willkommen bei Google".
  • Wenn der Benutzer von woanders kommt, werden wir nichts vorwegnehmen.

Lassen Sie uns also den test, den wir zuvor erstellt haben, testAddWelcomeMessage anstelle von drei neuen Tests entfernen.

Zuerst fügen wir einen Test hinzu, der die Twitter-Willkommensnachricht überprüft.

Im Plugin reduzieren wir die add_welcome_message auf diese:

Und wir fügen zuerst den Twitter-Test hinzu:

An diesem Punkt ist das ein alter Hut, oder? Führen Sie es aus, der Test wird fehlschlagen. Implementieren Sie die Nachricht add_welcome_message wie folgt:

Führen Sie es erneut aus, und es wird vergehen. Als nächstes kommt der Google-Test:

Führen Sie den Test aus, lassen Sie ihn fehlschlagen und aktualisieren Sie dann die Nachricht add_welcome_message im Plugin so, dass sie einen Check enthält, der die zuvor beschriebene Hilfsfunktion verwendet:

An dieser Stelle sollten Sie ein voll funktionsfähiges Plugin mit sieben bestandenen Unit-Tests haben!


Fazit

Wie Sie sehen, führt Unit-Testing eine zusätzliche Entwicklungsstufe ein, die sich jedoch in wartungsfähigem, gut organisiertem und testbarem Code erheblich auszahlen kann. Wenn Ihre Anwendung wächst, können Tests kontinuierlich durchgeführt werden, um zu überprüfen, ob Ihre Projekte wie erwartet funktionieren. Natürlich ist dies nur ein kleines Beispiel dafür, wie Einheitentests funktionieren. Die Anwendung dieser Praktiken kann sich in viel größeren und / oder komplizierteren Projekten auszahlen.

Schließlich können Sie dieses Plugin, die WordPress-Tests und die Hello Reader-Unit-Tests vollständig kommentiert auf GitHub finden.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.