Hinzufügen von Unit-Tests zu einem vorhandenen WordPress-Plugin

Hinweis: Der folgende Artikel hilft Ihnen dabei: Hinzufügen von Unit-Tests zu einem vorhandenen WordPress-Plugin

Hinzufügen von Unit-Tests zu einem vorhandenen WordPress-Plugin

Bisher haben wir kaum mehr getan, als Sie in die Idee des Erstellens von Tests für Ihre WordPress-Plugins einzuführen und über eine Reihe zusätzlicher Begriffe zu sprechen, die Sie verstehen müssen, um tiefer in das Testen Ihres Codes einzutauchen. Heute machen wir es praktisch, indem wir uns eines meiner kostenlosen Plugins schnappen und ein paar Unit-Tests hinzufügen, um Ihnen zu zeigen, wie man es zusammenstellt.

Sie finden das Plugin auf Github oder WordPress.org. Genau wie in meinem vorherigen Beitrag gehe ich davon aus, dass Sie WP CLI installiert haben und grundlegende Tests einrichten können. Wenn Sie nicht in der Lage sind, meinen Beitrag zu Unit-Tests in WordPress zu lesen.

Im Gegensatz zum letzten Mal müssen wir nur noch ein Gerüst für die Tests erstellen, damit wir mit dem folgenden Befehl in unserer WordPress-Installation beginnen können.

wp scaffold Plugin-tests wptt-ics-feeds

Kommen wir nun dazu, ein paar Tests zu schreiben.

Als Erstes möchte ich sicherstellen, dass die Links, die ein Benutzer in seinem Profil mit Kalender-Feeds sieht, korrekt sind. Konkret werden wir uns das ansehen get_subscribe_link Funktion.

In diesem Abschnitt können Sie die abgeschlossenen Tests einsehen Hier.

Beginnen wir damit, die Standard-Beispieltestdatei zu kopieren und in test-feed-links.php umzubenennen. Ich erstelle immer gerne unterschiedliche Dateien für die Bereiche der Plugins, für die ich Tests schreibe, auch wenn das bedeutet, dass ich viele Dateien bearbeiten muss. Mit klar gekennzeichneten Dateien ist es viel einfacher, den Überblick zu behalten.

Dieses Plugin ist etwas älter und instanziiert beim Start eine globale Variable. Dies ermöglicht es uns, dies in unserer SetUp-Funktion global aufzurufen, sodass wir Zugriff auf den Plugin-Code haben. Wir müssen auch die WordPress Factory verwenden, um einen neuen Benutzer einzurichten, damit wir die mit diesem Benutzer bereitgestellten Links testen können. Das bedeutet, dass unsere SetUp- und TearDown-Funktionen so aussehen sollten.

Lesen:  Wie kann man mit Cython programmieren und von seinen Vorteilen profitieren?

öffentliche Funktion setUp(){

parent::setUp();

// Das Plugin global abrufen

$this->plugin = $GLOBALS[‘wptt_ics_feeds’];

// einen Fake-Benutzer erstellen

$this->editor = new WP_User( $this->factory->user->create( array( ‘role’ => ‘editor’ ) ) );

}

öffentliche Funktion tearDown(){

parent::tearDown();

wp_delete_user( $this->editor->ID, true );

}

Jetzt können wir einen Test für unsere Feed-Links schreiben. Wir schreiben zwei verschiedene Tests, um beide Situationen zu testen, in denen sich die Link-Funktion befinden kann. Zuerst testen wir get_subscribe_link() ohne Argumente.

/**

* Testet den Basis-Feed-Link ohne Autor

*/

öffentliche Funktion test_base_feed_link(){

$feed_link = $this->plugin->get_subscribe_link();

$complete_link = site_url() . ‘/?feed=wptticsfeeds’;

$this->assertEquals( $feed_link, $complete_link, ‘Die Feed-Links sind nicht gleich’ );

}

Als Erstes greift der obige Code auf unsere Plugin-Instanz zu, wie in der Funktion „setUp“ definiert, und ruft die Funktion „get_subscribe_link()“ auf. Als nächstes codiere ich die erwartete Ausgabe der Funktion hart, damit ich etwas zum Vergleich habe. Schließlich verwenden wir affirmEquals um die beiden Werte zu vergleichen.

Wenn das erledigt ist, kann ich zurück zum Terminal gehen und die Tests mit dem Befehl phpunit ausführen. Wenn meine Tests erfolgreich sind, sehe ich etwa die Ausgabe unten. Wenn sie die Tests nicht bestehen, erhalte ich eine große rote Warnung anstelle eines grünen Balkens. Das bedeutet, dass ich herausfinden muss, warum sie die Tests nicht bestehen, und die Tests korrigieren muss.

In diesem Fall sind unsere Tests bestanden und wir können mit dem Testen der Ausgabe unserer Link-Funktion fortfahren, wenn wir einen Autorennamen übergeben. Sie können diesen Test unten sehen.

/**

* Testet den Feed-Link mit dem Autor

*/

öffentliche Funktion test_author_feed_link(){

$feed_link = $this->plugin->get_subscribe_link( array( ‘author’ => $this->editor->ID ) );

$complete_link = esc_url( site_url() . ‘/?feed=wptticsfeeds&wpttauthor=”. $this->editor->user_login );

$this->assertEquals( $feed_link, $complete_link, „Die Feed-Links mit dem Autor sind nicht gleich“ );

}

Hier machen wir fast das Gleiche wie beim vorherigen Test unseres Links. Die Änderung besteht darin, dass wir den Benutzer übergeben, den wir mit unserer Funktion „setUp“ erstellt haben, und dann testen, um sicherzustellen, dass dieser Link mit „assertEquals“ wie erwartet angezeigt wird.

Kommen wir nun zum Testen des benutzerdefinierten Filters im Plugin.

Testen eines WordPress-Filters mit PHPUnit

Ich hatte in der Vergangenheit einige Streitigkeiten mit anderen Entwicklern über das Testen von Filtern. Einige machen sich nicht die Mühe, ihre internen Plugin-Filter zu testen, aber ich denke, dass Sie diese Filter testen sollten. Manchmal ändern sich Filternamen und Sie vergessen dies, also dokumentieren Sie es nirgendwo und überprüfen Sie nicht, ob der Filter verwendet wird. Wenn Sie einen einfachen Test für Ihren Filter schreiben, wird dies deutlich, denn wenn Sie den Filternamen ändern, tritt ein Testfehler auf.

Lesen:  Chancen durch den Plattformwechsel von Magento schaffen

Für diesen Test fügen wir unserem Testordner eine neue Datei mit dem Namen test-filters.php hinzu. Ich werde diese Datei verwenden, um alle zukünftigen Filter zu testen, die im Plugin getestet werden müssen. Diesmal muss unsere SetUp-Funktion nur eine Instanz unseres Plugins instanziieren und unsere TearDown-Funktion muss nichts tun. Siehe den Code unten.

öffentliche Funktion setUp(){

parent::setUp();

// Das Plugin global abrufen

$this->plugin = $GLOBALS[‘wptt_ics_feeds’];

}

öffentliche Funktion tearDown(){

parent::tearDown();

}

Als nächstes müssen wir den Test für unseren Filter schreiben, den Sie unten sehen können.

/**

* Testet, ob die Zeit des Beitrags mit einem Filter geändert werden kann

*/

öffentliche Funktion test_posts_where_filter(){

add_filter( ‘wptt_ics_feeds_how_old’, array( $this, ‘new_where’ ), 10, 2 );

$output = $this->plugin->two_months( ” );

$date = date(‘Ym-d’, strtotime( $this->new_where() ) );

$this->assertStringContainsString( $date, $output, ‘Der Datumsfilter hat nicht funktioniert’ );

}

öffentliche Funktion new_where(){

return ‘-1 Woche’;

}

Als Erstes rufen wir unseren Filter auf und übergeben ihm dann unsere new_where-Funktion. Ich schreibe immer gerne eine separate Funktion für Filtertests, da ich sie am Ende so oft in mehreren Tests verwendet habe, dass ich das Gefühl habe, dass dies später Arbeit spart. Unsere Funktion new_where übergibt die Zeichenfolge -1 Woche an unseren Filter.

Als nächstes rufen wir unsere two_months()-Funktion innerhalb des Plugins auf. Dann verwenden wir ein Standard-PHP Datum Funktion, um das Format zu erhalten, das wir für das Datum erwarten. Da es mir vor allem darum geht, dass das Datum in dem von mir verwendeten Plugin richtig analysiert wird behauptenStringContainsString um zu prüfen, ob die Ausgabe der Funktion „two_months“ dieselbe Datumszeichenfolge wie die Variable „$date“ enthält.

Auch hier gilt: Wenn Ihre Tests erfolgreich sind, sollte alles im grünen Bereich sein. Wenn sie versagen, erhalten Sie eine große rote Warnung anstelle des angenehmen grünen Balkens.

Lesen:  Wie viel Geld müssen Sie auf Ihr 401(k)-Konto einzahlen?

Warum testen wir nicht die ICS-Feed-Ausgabe?

Beachten Sie, dass ich die endgültige Ausgabe unseres ICS-Feeds nicht getestet habe. Dies ist zwar möglich, es gibt jedoch eine Reihe beweglicher Teile, die ausfallen könnten und nichts mit meinem Code zu tun haben. Ich könnte den ICS-Feed an einen Online-Validator senden und dann die JSON-Antwort erhalten und sie analysieren, um zu überprüfen, ob sie gültig ist.

Wenn die HTTP-Anfrage fehlschlägt, schlägt mein Test fehl. Wenn der Online-Validierungsdienst heruntergefahren wird, schlägt mein Test fehl. Es gibt eine Reihe anderer Szenarien, die ebenfalls dazu führen können, dass mein Test ohne meine Schuld fehlschlägt. Aus diesem Grund habe ich beschlossen, den endgültigen Feed nicht programmgesteuert zu testen, und bin zu dem Schluss gekommen, dass ich ihn testen könnte, indem ich einen Feed in meinem Kalender abonniere und prüfe, ob meine Beiträge tatsächlich wie erwartet im Kalender erscheinen.

Dies ist kein Unit-Test

Ich bin sicher, dass einige von Ihnen sich das ansehen und sagen, dass ich keine Unit-Tests schreibe, und Sie haben Recht. Ich schreibe Integrationstests, weil sich mein Code in WordPress integrieren lässt, damit die Tests funktionieren. Ja, Sie können es verwenden WP_Mock WordPress zu fälschen, um echte Unit-Tests zu schreiben, aber meistens ist es mir wichtig, dass mein Code funktioniert mit WordPress.

Heute haben wir uns das Hinzufügen einiger Tests zu einem vorhandenen WordPress-Plugin angesehen, um ein praktisches Beispiel dafür zu geben, wie Tests für Ihre Projekte funktionieren können. Um weiter zu lernen, sehen Sie sich den Business Case für die Integration von Tests in Ihren Prozess als Geschäftsinhaber an. Da die Entwicklung länger dauern wird, kann es schwierig sein, über die Vorabkosten hinauszuschauen, aber sie zahlen sich aus.