Skip to content

PHP Unit

Alexander Walther edited this page Sep 1, 2024 · 1 revision

PHPUnit

Genauso wie bei Rexstan müssen bei PHP Unit Abhängigkeiten hinterlegt werden.

Danach ist der Workflow für eigene Tests vorbereitet. In .tools/bootstrap.php sind Variablen für PHPUnit festgelegt. In phpunit.xml.dist sind die Regeln für PHPUnit definiert. In der Composer.json ist ein Script unit-test hinterlegt, das die Tests ausführt. Es werden automatisch alle Tests ausgeführt die im Ordner tests/unitliegen und mit _test.php enden.

PHPUnit lokal ausführen

Auch PHPUnit kann lokal ausgeführt werden. Wie bei PHP CS Fixer müssen einmalig Composer und die benötigten Packages installiert werden. Danach können die Tests über die Konsole mit composer unit-test ausgeführt werden.

Eigene Unit-Tests schreiben

Mit einem Unit Test kann man eigene PHP Klassen automatisiert Prüfen lassen und damit festlegen, ob die Klasse auch nach Änderungen wie gewünscht funktioniert.

  1. Im AddOn im Ordner tests/unit eine neue Datei mit einem aussagekräftigen Namen anlegen. Der Name muss mit _test.php enden. (Empfehlung: addonname_test.php)
  2. Eine Testklasse für die zu prüfende Klasse anlegen. Die Klasse muss mit TEST enden und erweitert die Klasse TestCase
  3. Für jeden Test der Klasse eine Funktion anlegen, die mit test beginnt. (Empfehlung: testFunktionName())
  4. In der Funktion wird dann definiert, was die Testklasse tun soll.
  5. Abschließend wird das Ergebnis (zum Beispiel mit einer Assert Funktion) überprüft. TestCase liefert etliche Assert Funktionen. Man kann auf true oder false prüfen, ob ein Ordner oder eine Datei existiert, zwei identische Werte vergleichen und noch vieles mehr (Dokumentation).

Langfristig sollte das Ziel sein, für jede Klasse und jede Funktion entsprechende Tests zu schreiben. Da dass jedoch viel Fleißarbeit ist, ist es sinnvoll, zunächst nur die wichtigsten Funktionen zu testen und ggf. neue Erweiterungen mit Tests zu versehen.

Beispiel Werte abgleichen

Hier wird die Ausgabe der eigenen Funktion mit einem erwarteten Wert abgeglichen.

class meineKlasseTEST extends TestCase {
    public function testFunktionName() {
        $actual = meineKlasse::funktionName();
        $expected = 'Erwarteter Wert';
        static::assertEquals($expected, $actual);
}

Beispiel rex_view::addCssFile

Dieser Test ist aus dem Redaxo Core. Hier wird addCssFile aus der Klasse rex_view getestet. Es wird geprüft, ob die Datei am Ende der Liste der CSS Dateien auftaucht. Außerdem wird geprüft, ob eine CSS Datei mit einem definierten Key auch wieder mit diesem Key aufrufbar ist.

class meineKlasseTEST extends TestCase {
    public function testAddGetCss(): void
    {
        rex_view::addCssFile('my.css');
        $files = rex_view::getCssFiles()['all'];
        static::assertTrue('my.css' == end($files));

        rex_view::addCssFile('print.css', 'print');
        $files = rex_view::getCssFiles()['print'];
        static::assertTrue('print.css' == end($files));
    }
}

Clone this wiki locally