Der Anfängerleitfaden für Unit-Tests Was ist Unit-Tests?

Abhängig von Ihrem Hintergrund haben Sie möglicherweise noch nicht von Unit-Tests, testgetriebener Entwicklung, verhaltensorientierter Entwicklung oder einer anderen Art von Testmethoden gehört. Oft werden diese Methoden im Zusammenhang mit größeren Softwaresystemen oder Anwendungen und weniger im Kontext von WordPress-basierten Projekten angewendet (obwohl dies der Fall ist) ist besser werden!)

Ehrlich gesagt ist die Entwicklergemeinde ein wenig gespalten in automatisierten Softwaretests. Einige Leute meinen, Sie sollten Tests für 100% des gesamten Codes durchführen. Einige glauben, dass 80% ausreichen, etwa 50% und einige sind damit zufrieden 20% oder so. Wie dem auch sei, in diesem Artikel geht es nicht darum, einen Fall für das Testniveau zu erörtern, das Sie in Ihrem Projekt haben sollten, und es bezieht sich nicht auf allgemeine Softwaretests.

Stattdessen werfen wir einen Blick darauf, was erforderlich ist, um Unit-Tests Ihrer WordPress-Entwicklungsprojekte durchzuführen. Wir werden uns dieser Serie aus der Sicht eines absoluten Anfängers nähern, um die Vorteile des Komponententests und die Konfiguration unserer Umgebung für die Unterstützung von Komponententestbibliotheken zu verstehen, sodass wir dies in unserer zukünftigen Arbeit tun können. Schließlich wird dies alles durch das Erstellen und Testen eines einfachen, testbaren Plugins von Grund auf durchgeführt.


Was ist Unit Testing??

Bevor wir mit der Einrichtung unserer Umgebung und dem Schreiben von Code beginnen, definieren wir genau, was Komponententests sind, warum es sich lohnt, und wie wir damit beginnen, sie in unsere Projekte zu integrieren.

Auf hoher Ebene bezieht sich Unit-Test auf die Praxis, bestimmte Funktionen und Bereiche - oder Einheiten - unseres Codes zu testen. Dies gibt uns die Möglichkeit zu überprüfen, ob unsere Funktionen wie erwartet funktionieren. Das heißt, dass wir für jede Funktion und mit einem Satz von Eingaben feststellen können, ob die Funktion die richtigen Werte zurückgibt, und Fehler im Verlauf der Ausführung ordnungsgemäß behandeln, falls ungültige Eingaben bereitgestellt werden.

Dies hilft uns letztendlich, Fehler in unseren Algorithmen und / oder Logik zu erkennen, um die Qualität des Codes zu verbessern, aus dem eine bestimmte Funktion besteht. Wenn Sie mehr und mehr Tests schreiben, erstellen Sie am Ende eine Reihe von Tests, die Sie jederzeit während der Entwicklung ausführen können, um die Qualität Ihrer Arbeit ständig zu überprüfen.

Ein zweiter Vorteil bei der Herangehensweise an die Entwicklung aus Sicht der Komponententests ist, dass Sie wahrscheinlich Code schreiben, der leicht zu testen ist. Da für Unit-Tests Ihr Code leicht testbar sein muss, bedeutet dies, dass Ihr Code diese Art von Bewertung unterstützen muss. Daher ist es wahrscheinlicher, dass Sie eine größere Anzahl kleinerer, fokussierter Funktionen haben, die eine einzelne Operation für einen Datensatz bereitstellen, statt große Funktionen, die eine Reihe verschiedener Operationen ausführen.

Ein dritter Vorteil beim Schreiben von Solid-Unit-Tests und des getesteten Codes besteht darin, dass Sie verhindern können, dass zukünftige Änderungen die Funktionalität beeinträchtigen. Da Sie Ihren Code testen, während Sie Ihre Funktionalität vorstellen, beginnen Sie mit der Entwicklung einer Reihe von Testfällen, die jedes Mal ausgeführt werden können, wenn Sie an Ihrer Logik arbeiten. Wenn ein Fehler auftritt, wissen Sie, dass Sie etwas ansprechen müssen.

Natürlich ist dies mit dem Aufwand verbunden, Zeit zu investieren, um eine Reihe von Tests zu einem frühen Zeitpunkt in der Entwicklung zu schreiben. Wenn das Projekt jedoch wächst, können Sie einfach die von Ihnen entwickelten Tests ausführen, um sicherzustellen, dass die vorhandene Funktionalität nicht beschädigt wird, wenn eine neue Funktionalität verfügbar ist eingeführt.


Planung unseres Plugins

Eine der besten Möglichkeiten, um mit dem Komponententest zu beginnen, ist dies im Kontext einer praktischen Anwendung. In dieser zweiteiligen Serie werden wir einfache Plugin- und Schreibtests erstellen, um die gesamte Funktionalität abzudecken.

Lassen Sie uns zunächst das Projekt planen: Wir werden ein kleines Plugin schreiben, das oben in einem einzelnen Beitrag eine einfache Nachricht hinzufügt, in der der Benutzer begrüßt wird, je nachdem, wie er einen bestimmten Blogbeitrag gefunden hat. Die Idee ist der von Welcome Reader sehr ähnlich, beinhaltet aber nicht annähernd so viel Funktionalität. Wir erstellen lediglich eine Demo, um die Besonderheiten des Testens zu erfahren.

Wie auch immer, das Plugin funktioniert folgendermaßen:

  • Wenn der Nutzer von Google zu der Website navigiert, erhalten Sie eine eindeutige Nachricht
  • Wenn der Benutzer von Twitter zu der Website navigiert, erhalten Sie eine eindeutige Nachricht
  • Andernfalls zeigen wir nichts an

Einfach genug, richtig? Dies bietet auch eine Grundlage, auf der Sie benutzerdefinierte Nachrichten für andere Dienste hinzufügen und unsere Testfunktionen für Einheiten erweitern können, falls Sie dies wünschen.


Umwelt vorbereiten

Um unseren Code zu testen, benötigen wir eine Bibliothek eines Drittanbieters, die wir in unser Projekt aufnehmen und die Tests, die wir schreiben, tatsächlich ausführen werden. In dieser Serie werden wir PHPUnit verwenden. Sie können sich hier eine Kopie davon holen.

Als Nächstes müssen wir unsere Entwicklungsumgebung vorbereiten, unser Plugin auschecken und die erforderlichen Bibliotheken zum Testen unseres Codes hinzufügen. Dieser Artikel setzt voraus, dass Sie bereits eine funktionsfähige WordPress-Installation installiert haben.

Zuerst bereiten wir das Plugin-Verzeichnis vor:

  • Im / wp-content / plugins Erstellen Sie ein Verzeichnis namens Hallo-Leser
  • In dem Hallo-Leser Erstellen Sie eine Datei mit dem Namen plugin.php und ein Verzeichnis namens Tests
  • Wir werden das Plugin austesten, um sicherzustellen, dass WordPress unser Projekt richtig sieht
  • Wir importieren die Unit-Testbibliotheken, damit wir mit dem Schreiben unserer Tests beginnen können

Hier ist das Grundgerüst für das Plugin, das wir erstellen werden:

/ * Plugin-Name: Hallo Reader-Plugin-URI: http://github.com/tommcfarlin/Hello-Reader Beschreibung: Ein einfaches Plugin, das zur Demonstration von Komponententests im Kontext von WordPress verwendet wird. Version: 1.0 Autor: Tom McFarlin Autor URI: http://tom.mcfarl.in Autor-E-Mail: [email protected] Lizenz: Copyright 2012 Tom McFarlin ([email protected]) Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, Version 2, wie von der Free Software Foundation veröffentlicht, weitergeben und / oder ändern. Dieses Programm wird in der Hoffnung verteilt, dass es nützlich ist, jedoch OHNE JEDE GARANTIE; sogar ohne die implizite Garantie der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Informationen finden Sie in der GNU General Public License. Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Wenn nicht, schreiben Sie an die Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * / // Erstellen Sie nur dann eine Instanz des Plugins, wenn es nicht bereits in GLOBALS if (! array_key_exists ('hello-reader', $ GLOBALS)) Klasse Hello_Reader Funktion __construct ()  // Endkonstruktor // Klasse beenden // Eine Referenz auf das Plugin in GLOBALS speichern, damit unsere Unit-Tests darauf zugreifen können $ GLOBALS ['hallo-reader'] = new Hello_Reader ();  // Ende wenn

An diesem Punkt sollten Sie in der Lage sein, zu den "Plugins" in Ihrem WordPress-Dashboard zu navigieren und einen Eintrag für "Hallo Leser" zu sehen. Offensichtlich macht dieses Plugin noch nichts - wir konzentrieren uns darauf (und warum wir das nutzen $ GLOBALS Array) im nächsten Artikel.

Lassen Sie uns schließlich das Testframework einrichten, damit wir unsere Tests schreiben können. Zuerst müssen wir PHPUnit installieren und dann die WordPress-Tests installieren.

Hinweis: Der nächste Abschnitt erfordert einige Arbeiten mit dem Terminal und erfordert wahrscheinlich einige Befehle, um symbolische Links zu erstellen. Ich habe versucht, dies so unkompliziert und einfach wie möglich zu gestalten, aber jedes Betriebssystem und jede Konfiguration wird anders sein. Bitte folgen Sie sorgfältig und ich lade Sie ein, Ihre Anweisungen für Ihre Betriebssysteme in den Kommentaren mitzuteilen.

PHPUnit installieren

PHPUnit ist ein Unit-Test-Framework-Paket, das speziell für PHP entwickelt wurde. Die WordPress-Tests und das Framework, das wir zum Schreiben unserer WordPress-Tests verwenden werden, hängen davon ab. Leider hängt die Installation von Ihrer Plattform ab. Ich verwende derzeit Mac OS X Lion mit MAMP Pro und PHP 5.3.6. Wenn Sie eine andere Plattform betreiben, lesen Sie unbedingt die Dokumentation und / oder geben Sie Ihre Schritte in den Kommentaren frei.

Öffnen Sie zuerst ein Terminal und aktualisieren Sie pear (dies ist die Einrichtung, die wir zur Installation von PHPUnit verwenden werden):

$ cd /Applications/MAMP/bin/php/php5.3.6/bin
$ sudo ./pear Upgrade Birne

Als Nächstes weisen Sie Pear an, Repositorys zu verwenden, die wir in terminal angeben:

$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear config-set auto_discover 1

Danach installieren Sie Pear mit dem folgenden Befehl:

$ sudo /Applications/MAMP/bin/php/php5.3.6/bin/pear install pear.phpunit.de/PHPUnit

Dadurch wird PHPUnit im Kontext Ihrer MAMP-Installation installiert. Um es auszuprobieren, führen Sie den folgenden Befehl in Ihrer Terminalsitzung aus:

$ /Applications/MAMP/bin/php/php5.3.6/bin/phpunit --version

Danach sollte folgende Meldung angezeigt werden:

PHPUnit 3.6.11 von Sebastian Bergmann.

Hinweis: Wenn Sie einen Terminalfehler erhalten, der "unserialize ()" erwähnt, besteht eine Diskrepanz zwischen der Birnenkonfiguration und Ihrer Birnenversion. Geben Sie den folgenden Befehl ein, um das Problem zu beheben (dies benennt die Datei einfach um, wenn Sie sie später wiederherstellen möchten):

$ /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf /Applications/MAMP/bin/php/php5.3.6/conf/pear.conf.old

Installation der WordPress-Tests

Nun, da wir PHPUnit installiert haben und arbeiten, ist es an der Zeit, das WordPress Testing Framework einzurichten. Sie können das Paket von GitHub herunterladen. Wenn Sie mit dem Klonen des Repository vertraut sind, können Sie dies gerne tun. Andernfalls laden Sie einfach ein Archiv des Projekts herunter und extrahieren Sie es in das Prüfung Verzeichnis, das wir zuvor in diesem Artikel erstellt haben.

Bevor wir die Tests tatsächlich ausführen, müssen wir eine Konfigurationsdatei erstellen, um WordPress-Tests auszuführen. Das ist genau wie das Bearbeiten von wp-config.php Datei mit einer neuen WordPress-Installation, aber wir machen es stattdessen für eine Testdatenbank. Unten habe ich meine Konfigurationsdatei eingefügt und Kommentare hinzugefügt. Ich werde dies sicher auch in das GitHub-Repository dieses Artikels übernehmen.

/ * Pfad zur WordPress-Codebase in Bezug auf den Ort dieser Tests. Da sie in unserem Plugin enthalten sind, verweisen wir auf einige Verzeichnisse oben. * / define ('ABSPATH', '… /… /… /… /… /'); / * Der Name der Datenbank zum Ausführen der Tests. Stellen Sie sicher, dass dies eine Datenbank ist, die nur zum Testen dient, da sie während des Tests erstellt und in den Papierkorb verschoben wird. * / define ('DB_NAME', 'wegwerfen'); / * Die üblichen Anmeldeinformationen für eine lokale Datenbank. * / define ('DB_USER', 'root'); define ('DB_PASSWORD', "); define ('DB_HOST', 'localhost'); define ('DB_CHARSET', 'utf8'); define ('DB_COLLATE',"); define ('WPLANG', "); define ('WP_DEBUG', true); define ('WP_DEBUG_DISPLAY', true); define ('WP_TESTS_DOMAIN', 'localhost'); define ('WP_TESTS_EMAIL','[email protected] '); define (' WP_TESTS_TITLE ',' Test Blog '); / * Keine Sorge um das Testen von Netzwerken oder Subdomains, also auf false setzen. * / define (' WP_TESTS_NETWORK_TITLE ',' Test Network '); define (' WP_TESTS_SUBDOMAIN_INSTALL ', false); $ base = '/'; / * Cron versucht, eine HTTP-Anforderung an den Blog zu stellen, die immer fehlschlägt, da Tests nur im CLI-Modus ausgeführt werden * / define ('DISABLE_WP_CRON', true); / * Auch nicht Interesse daran, Multisite für dieses Projekt zu testen, setzen Sie den Wert auf false. * / define ('WP_ALLOW_MULTISITE', false); if (WP_ALLOW_MULTISITE) define ('WP_TESTS_BLOGS', 'first, second, dritter, vierter'); if (WP_ALLOW_MULTISITE) &&! '' '(' WP_INSTALLING ')) define (' SUBDOMAIN_INSTALL ', WP_TESTS_SUBDOMAIN_INSTALL); define (' MULTISITE ', true); define (' DOMAIN_CURRENT_SITE ', WP_TESTS_DOMAIN); efine ('SITE_ID_CURRENT_SITE', 1); define ('BLOG_ID_CURRENT_SITE', 1);  $ table_prefix = 'wp_';

Um zu überprüfen, ob Sie die Tests ordnungsgemäß installiert haben, können Sie den folgenden Befehl in Ihrem Terminal ausführen:

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

Wenn Sie eine Fehlermeldung erhalten, liegt dies daran, dass die WordPress-Tests versuchen, einen Socket für die MySQL-Datenbank zu verwenden, anstatt den von MAMP verwendeten. Um dies zu beheben, müssen Sie eine symbolische Verbindung zwischen dem MAMP-Socket und dem Speicherort auf der Festplatte erstellen, den die Gerätetests verwenden. Geben Sie in Ihrer Terminalsitzung die folgenden Befehle aus:

$ sudo mkdir / var / mysql $ sudo ln -s /Anwendungen/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock $ sudo ln -s /Applications/MAMP/tys/mysql.sock/ var / mysql / mysql.sock

Versuchen Sie nun, die Tests erneut auszuführen, und Sie sollten etwa den folgenden Screenshot sehen.

Wieder kann Ihre Laufleistung je nach Plattform variieren, die Sie verwenden. Sie können also gerne Ihre Erfahrungen in den Kommentaren teilen oder sich sogar in die README-Datei auf GitHub festlegen, sodass andere Benutzer einen Bezugspunkt haben können.

Jetzt können wir mit dem Bau unseres Plugins beginnen und unsere Unit-Tests schreiben. Der obige Code wurde zu GitHub hinzugefügt und ich werde ihn weiter ausarbeiten, während wir den nächsten Artikel der Serie durcharbeiten. Stellen Sie in der Zwischenzeit sicher, dass Sie Ihre Umgebung einrichten und mit der Entwicklung beginnen können. Im nächsten Artikel beginnen wir eigentlich mit dem Schreiben von Tests, dem Erstellen unseres Plugins und dem Zusammenspiel des gesamten Projekts.


Ressourcen

  • PHPUnit
  • WordPress-Tests
  • Hallo Leser