So beginnen Sie mit dem Testen Ihres WordPress-Codes mit dem Pest PHP Testing Framework

Veröffentlicht: 2022-05-18

Wir sind uns alle einig, dass WordPress seit seinen Anfängen einen langen Weg zurückgelegt hat und dass es sich zu etwas viel mehr als nur einer Blogging-Software entwickelt hat.

Im Kern ist es immer noch ein Content-Management-System (CMS), aber mit über 59.000 Plugins im WordPress.org-Verzeichnis können Sie es so anpassen, dass es viel mehr ist.

Der Grund für seine Popularität ist seine niedrige Eintrittsbarriere für Inhaltsersteller und Entwickler. Manchmal ist dies mit Kosten verbunden. Dass WordPress in Sachen Entwicklung einen schlechten Ruf hat, ist kein Geheimnis. Es hat eine Menge Altlasten und hartnäckige Regeln, die jede Änderung der Abwärtskompatibilität verhindern, wenn es um PHP-Code geht (Gutenberg ist eine andere Geschichte, auf die ich nicht eingehen werde).

Dieser veraltete PHP-Code wird oft von Entwicklern verwendet, die anfangen, in die Welt der Programmierung einzusteigen, und das Problem dabei ist, dass sie einige schlechte Programmiermuster lernen können. Das wiederum bedeutet, dass sie den schlecht geschriebenen Code wiederverwenden werden, wodurch die Menge an schlechtem Code in der Welt zunimmt.

Dadurch bekommt WordPress seinen schlechten Ruf in der Entwickler-Community.

Den Kreislauf durchbrechen

Wie können wir also diesen Kreislauf von schlechtem Code durchbrechen? Indem Sie neuen Entwicklern beibringen, wie sie guten Code schreiben sollten. Ein Beispiel für das Unterrichten neuer Entwickler (aber auch alter Entwickler, die immer noch an der „WordPress“-Methode festhalten) ist das Schreiben von Tutorials.

Eine andere Möglichkeit besteht darin, sie zu ermutigen, Tools zu verwenden, die ihnen helfen können, besseren Code zu schreiben.

Ich bin derzeit an der Arbeit beteiligt, die darauf abzielt, die neue Version der WordPress Coding Standards zu veröffentlichen, eine Reihe von Regeln, die für das Tool PHP_CodeSniffer verwendet werden und Sie darüber informieren, ob Ihr Code potenzielle Probleme aufweist (Sicherheit, Best Practices, Codestil ).

Ein weiteres Tool, das ich kürzlich entwickelt habe, ist ein Paket, das Entwicklern helfen wird, WordPress-Integrationstests einzurichten, die das Pest-Testing-Framework verwenden.

Ok, warum brauchen wir dieses neue Tool?

Die Hauptmotivation hinter der Erstellung dieses Pakets besteht darin, mehr Leute zu ermutigen, Tests für ihren Code zu schreiben, insbesondere Plugin-Entwickler.

Viele Entwickler in der WordPress-Community folgen dem Mantra: Ich sehe, dass es funktioniert, weil ich es in meinem Browser ausprobiert habe. Das ist in Ordnung, aber es gibt Probleme damit.

Erstens ist es zeitaufwändig. Jedes Mal, wenn Sie etwas ändern, müssen Sie sicherstellen, dass es funktioniert, aber auch, dass Sie nichts kaputt gemacht haben.

Zweitens machen Menschen Fehler. Wir sind nicht narrensicher, und Code kann auf eine Weise missbraucht werden, die Sie nie für möglich gehalten hätten. Sie werden erstaunt sein, wie kreativ Menschen beim Schreiben von Code sein können.

Automatisierte Tests sind schnell und können Ihnen beim Testen verschiedener Fälle helfen, die auftreten, wenn Sie Ihren Code ausführen.

Sie testen das beabsichtigte Verhalten (glücklicher Pfad) und können schnell Beispiele hinzufügen, wie Ihr Code auf eine Weise verwendet werden kann, die Sie nicht beabsichtigt haben (unglücklicher Pfad).

Es schützt Ihren Code auch vor Regressionen. Eine Coderegression liegt vor, wenn Sie unbeabsichtigt einen Teil Ihres Codes beschädigen, indem Sie neuen Code hinzufügen.

Das Problem mit den bisher eingerichteten Tests

Das Testen in WordPress ist nichts Neues. Und es ist nicht so, dass Sie vorher keine Tests für Ihren Code einrichten konnten. Es gibt erstaunliche Bibliotheken, die Ihnen helfen, alles wie wp-browser einzurichten.

Das Problem ist jedoch, dass die Einrichtungsprozedur oft klobig ist.

Sie müssen eine separate Datenbank für Tests einrichten, bestimmte Skripte ausführen und dann Dateien ändern, damit alles funktioniert.

Seien wir ehrlich, es ist keine einfache Sache, und Entwickler sind von Natur aus faule Kreaturen (deshalb schreiben wir Code, um Dinge für uns zu tun).

Das Ziel des wp-pest-Integrationstest-Setups ist es, all diese zusätzliche Arbeit zu eliminieren.

Wie man es einrichtet

Um es einzurichten, muss Ihr Projekt Composer verwenden. Es ist eine De-facto-Standardmethode zum Hinzufügen von Paketen zu Ihrem Code.

Geben Sie in Ihrem Terminal ein

 composer require dingo-d/wp-pest-integration-test-setup --dev

Nachdem Sie das Paket und seine Abhängigkeiten heruntergeladen haben, können Sie die Thementests durch Eingabe einrichten

 vendor/bin/wp-pest setup theme

Oder falls Sie Tests für Ihr Plugin einrichten möchten, können Sie schreiben

 vendor/bin/wp-pest setup plugin --plugin-slug=your-plugin-slug

Optional können Sie einen Parameter --wp-version angeben, um anzugeben, auf welcher WordPress-Version Sie Ihren Code testen möchten.

Im Hintergrund wird eine WordPress-Instanz heruntergeladen und eine In-Memory-Datenbank eingerichtet, zusammen mit zwei Beispieltests, die Sie ausführen können.

Dann läuft entweder

 vendor/bin/pest --group=unit

oder

 vendor/bin/pest --group=integration

werde die Tests durchführen.

Das Schöne an Pest ist, dass seine Syntax entwicklerfreundlich ist. Es hat eine erstaunliche Dokumentation und eine großartige Syntax. Schauen wir uns ein einfaches Beispiel an. Angenommen, Sie registrieren einen benutzerdefinierten Beitragstyp namens „Bücher“:

 <?php /** * Plugin Name: Test plugin * Desctiption: Test plugin * Version: 1.0.0 * License: MIT */ function test_plugin_register_books_cpt() { $args = array( 'label' => esc_html__( 'Books', 'test-plugin' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'book' ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ), ); register_post_type( 'book', $args ); } add_action( 'init', 'test_plugin_register_books_cpt' );

Nach dem Ausführen des Setup-Befehls, der ein Beispiel hinzufügt, würde ein Test namens BooksCptTest.php so aussehen:

 <?php namespace Tests\Integration; beforeEach(function () { parent::setUp(); }); afterEach(function () { parent::tearDown(); }); test('Books custom post type is registered', function () { // We can use assertions from PHP_Unit. $this->assertNotFalse(has_action('init', 'test_plugin_register_books_cpt')); $registeredPostTypes = \get_post_types(); // Or we can use expectations API from Pest. expect($registeredPostTypes) ->toBeArray() ->toHaveKey('book'); });

vendor/bin/pest --group=integration wir die folgende Ausgabe:

 Installing... Running as single site... To run multisite, use -c tests/phpunit/multisite.xml Not running ajax tests. To execute these, use --group ajax. Not running ms-files tests. To execute these, use --group ms-files. Not running external-http tests. To execute these, use --group external-http. PASS Tests\\Integration\\BooksCptTest ✓ Books custom post type is registered Tests: 1 passed Time: 0.14s

Fazit

Und einfach so haben Sie die Möglichkeit, WordPress-Integrationstests in Ihrem Design oder Plugin durchzuführen. Tests sind erstaunlich, weil sie uns nicht nur vor Fehlern schützen, sondern uns auch dazu zwingen, sauberen und testbaren Code zu schreiben. Dies gilt insbesondere für Plugins, die eine komplizierte Logik haben oder mit APIs von Drittanbietern kommunizieren.

Das Schreiben von Tests für eine solche Codebasis zwingt Sie dazu, darüber nachzudenken, wie Ihre Codearchitektur aussieht, damit Sie problemlos automatisierte Tests schreiben können – ganz zu schweigen von der Zeit und dem Geld, das Sie sparen, da Sie nicht alles manuell testen müssen.

Wenn Sie der Meinung sind, dass Sie davon profitieren könnten, können Sie es gerne verwenden und das Repository auf GitHub mit einem Stern versehen.

Hoffentlich wird dies mehr WordPress-Entwickler dazu ermutigen, Tools zu verwenden, die ihre Programmierfähigkeiten verbessern.