Eine Einführung in WordPress Akzeptanztests mit Codeception

Einen WordPress Akzeptanztest mit Codeception durchführen
Ich möchte eine Basiseinführung in Akzeptanztests geben, was dir hilft herauszufinden, ob du alle Projekterwartungen erfüllst.

In diesem Blogpost möchte ich dir etwas über WordPress Akzeptanztests mit Codeception erzählen. Ich werde dir, erklären, was Acceptance Tests sind und wie du sie in WordPress erstellst. Außerdem werden wir gemeinsam einen Acceptance Test durchführen.

Was sind Akzeptanztests?

In der großen Masse von Testtypen kann man Akzeptanztests gegenüber von Unit Tests einsetzen. Während du bei Unit Tests allerdings nur einen kleinen Abschnitt von Code testest, testest du bei Akzeptanztests das finale Produkt aus Kundensicht.

Acceptance Tests variieren von “Auf einen Button klicken” bis hin zu Bestellungen auf E-Commerce Seiten.

Das Besondere an Akzeptanztests ist, dass sie auch von Nicht-Programmierern durchgeführt werden können. Von Produktmanagern bis hin zu Kunden können alle, die etwas mit dem Projekt zu tun haben, in kurzen Worten beschreiben, was sie machen und was sie erwarten, was passieren wird. Das ist im Kern auch das, worum es bei Akzeptanztests geht. Es geht darum herauszufinden, ob die Projekterwartungen erfüllt werden.

Für alle Tests gibt es eine wichtige Regel. Je mehr du testest, desto robuster und weniger fehleranfällig wird dein Produkt sein. Besonders Akzeptanztests geben bei Produktveröffentlichungen ein gutes Licht ab, denn dort musst du gewährleisten, dass das, was du lieferst, auch dem entspricht, was der Kunde erwartet. Ein anderer großer Anwendungsfall sind Regressionstests. Dort musst du gewährleisten, dass ein Issue, welches du gefixed hast, nicht in Zukunft wieder auftreten wird.

So richtest du eine Testumgebung ein

Um Tests auszuführen, brauchen wir eine Testumgebung, die man leicht einrichten kann. Wir werden Docker nutzen, was direkt verwendbare Bilder von WordPress, Codeception und Selenium Chrome anbietet.

Zur Veranschaulichung dieses Artikels habe ich ein Github Repository erstellt, welches eine Basis-Testumgebung enthält. Ich habe außerdem ein kurzes Video erstellt. Es zeigt den gesamten Erstellungsprozess: https://vimeo.com/245350458

Im Video nutze ich Docker in Mac über die Docker Toolbox, der Prozess sollte in Windows ähnlich sein. In Linux ist es ein bisschen anders, weil du Docker direkt in deinem Computer installierst statt über eine Virtuelle Maschine.

Hier ein kleines Detail im Repo, auf das ich hinweisen möchte. Die Dockerfile enthält ein Kommando, welches dir erlaubt Genehmigungen an die www-Datengruppe innerhalb des WordPress Containers zu schreiben. Das musste ich hinzufügen, um Rechteprobleme zu vermeiden, wenn Bilder hochgeladen oder Plugins installiert werden. Das kann von Nutzer zu Nutzer unterschiedlich sein und hängt davon ab, welchen Computer du verwendest oder wie du Docker nutzt.

Wie du am Ende des Videos sehen kannst, mache ich ein Datenbank-Backup. Dadurch wird sich die Datenbank vor jedem Test zurücksetzen. Dieses Verhalten kannst du in tests / acceptance.suite.yml Db module konfigurieren.

Codeception Module

Meiner Meinung nach sind die beiden sinnvollsten Codeception Module WebDriver und Db. WebDriver ist besonders praktisch, wenn in deinen Tests JavaScript involviert ist. Es erlaubt dir, über executeJS JaveaScript Code direkt in deinen Tests auszuführen. Db ist besonders dann sinnvoll, wenn deine Tests auf die Datenbank schauen oder mit ihr Vorgänge ausführen müssen.

Tests schreiben

Ein üblicher Zugang, um Tests zu schreiben, ist, die Aktionen manuell durchzuführen und alle Schritte und Ergebnisse in ein Dokument zu schreiben. Ein anderer üblicher Zugang ist das Schreiben von User Stories oder das Schreiben von Tests, die zum Beispiel auf Support Tickets basieren. Welchen Zugang auch immer du wählst: Es ist sehr wichtig, dass die Tests klar definiert sind, bevor du mit dem Coden beginnst.

Als Beispiel werden wir einen einfachen Akzeptanztest für das BackWPup Plugin schreiben. Wir werden testen, ob die Allgemeine Einstellungsseite so funktioniert wie erwartet. Um das zu tun, müssen wir das Plugin installieren und aktivieren. Danach erstellen wir ein Datenbank-Backup und kopieren es nach tests/_data/dump.sql

Einen Test erstellen

Codeception unterstützt 3 Test Formate.  In diesem Beispiel werden wir das Cest Format nutzen, welches wie eine PHP Klasse aussieht. Es beinhaltet die Ausführungsfunktionen before und after wie andere Test Frameworks auch.

Um die Datei zu erstellen, führe dieses Kommando aus:

docker-compose run --rm codecept generate:cest acceptance SettingsPage

Das obenstehende Kommando wird eine neue Datei in tests/acceptance/SettingsPageCest.php erstellen.

Wie du im folgenden Code sehen kannst, nutzen wir die  _before function, um uns als WordPress Admin einzuloggen, bevor wie die  general_settings_page Funktion ausführen, welche überprüft, ob die Felder auf der Allgemeinen Einstellungsseite richtig gespeichert wurden:

<?php

class SettingsPageCest {

    public function _before( AcceptanceTester $I ) {

        $I->amOnPage( '/wp-login.php' );
        $I->wait( 1 );
        $I->fillField( [ 'name' => 'log' ], 'admin' );
        $I->fillField( [ 'name' => 'pwd' ], 'password' );
        $I->click( '#wp-submit' );
    }

    public function general_settings_page( AcceptanceTester $I ) {

        $I->amOnPage('/wp-admin/admin.php?page=backwpupsettings');
        $I->see('Display Settings', 'h3');

        $I->dontSeeCheckboxIsChecked('#showadminbarmenu');
        $I->dontSeeCheckboxIsChecked('#showfoldersize');
        $I->seeCheckboxIsChecked('#protectfolders');

        $I->checkOption('#showadminbarmenu');
        $I->checkOption('#showfoldersize');
        $I->uncheckOption('#protectfolders');
        $I->click('Save Changes');

        $I->seeCheckboxIsChecked('#showadminbarmenu');
        $I->seeCheckboxIsChecked('#showfoldersize');
        $I->dontSeeCheckboxIsChecked('#protectfolders');
    }
}

Um den ganzen Test auszuführen, nutze einfach:

docker-compose run --rm codecept run

Um einen individuellen Test auszuführen, nutze einfach

docker-compose run --rm codecept run acceptance some-folder/SomeClassCest:some_function

Zusammenfassung

Dieser Artikel ist nur eine kurze Einführung in das Thema von Akzeptanztests. Wir haben nur an der Oberfläche gekratzt, als wir darüber sprachen, wie man eine Testumgebung erstellt und wie man beginnt, damit ein bisschen zu spielen. Ich hoffe, es hat dir Spaß gemacht diesen Artikel zu lesen. Es würde mich freuen, wenn du etwas Neues gelernt hast, das du in deinen eigenen Projekten verwenden kannst. Das war schließlich meine Intention, als ich diesen Artikel geschrieben habe. 🙂