© KenoKickit/Shutterstock.com
Wie man Tests für PHP schreibt - in PHP

PHP Core erweitern - Test für Test


Im September 2000 begann ich meine Berufsausbildung bei einer Internetagentur, die aus zwei Teams bestand: eines für JavaServer Pages, eines für PHP. Ich wurde dem PHP-Team zugeteilt, und als mir die Sprache vorgestellt wurde, dachte ich mir: Niemand wird diese Sprache jemals nutzen! Ich hätte mich nicht stärker täuschen können. Heute ist meine gesamte Karriere auf PHP aufgebaut, und ich möchte der Community etwas zurückzugeben. Wie? Indem ich Tests für den PHP Core schreibe. Dieser Artikel zeigt, wie einfach das ist und wie Sie davon profitieren.

Bevor wir unseren ersten eigenen Test für den PHP Core schreiben, wollen wir uns anschauen, wie man bereits existierende Tests ausführen kann. Dafür laden wir uns den PHP-Quellcode von GitHub herunter und kompilieren ihn:

$ git clone git@github.com:php/php-src.git $ cd php-src $ ./buildconf $ ./configure --with-zlib $ make -j `nproc`

Es empfiehlt sich, vorher einen Fork anzulegen. Das macht es später leichter, einen Pull Request zu stellen. Falls noch kein Compiler oder keine Build-Tools auf dem Linux-System installiert sind, lässt sich dies mit der development-tools-Gruppe unter Fedora bzw. den build-essentials unter Debian Linux nachholen. Es kann vorkommen, dass die Anweisung ./configure einen Fehler wirft. Das passiert üblicherweise, wenn Anforderungen für den Build nicht erfüllt sind. Dann installiert man einfach die fehlenden Komponenten und startet den Vorgang erneut.

Beachten muss man dabei, unbedingt die Development Packages zu installieren. Ich hatte beispielsweise den Fall, dass das configure-Skript ein fehlendes libxml monierte, obwohl es bereits installiert war. Was tatsächlich fehlte, waren die Headerdateien, die sich nur in den Development Packages befinden. Erkennen kann man Development Packages normalerweise an dem Suffix dev oder devel. Auch das --with-zlib ist in unserem Fall zwingend, da wir die zlib Extension für den Test, den wir schreiben wollen, benötigen. Sie ist nicht standardmäßig im Build enthalten.

Ist der Build erfolgreich erstellt, findet man die PHP Binaries in ./sapi/cli/php. Schauen wir uns an, was wir gerade erzeugt haben:

$ ./sapi/cli/php –v PHP 8.0.0-dev (cli) (built: Jul 14 2020 21:05:42) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies

Wir haben ein frisch gebautes und laufendes PHP Binary. Damit ist es an der Zeit, die Tests auszuführen, die sich im GitHub Repository befinden (Listing 1). Seit PHP 7.4 können die Tests parallel ausgeführt werden. Die Anzahl der gleichzeitig durchgeführten Jobs kann im Argument -j angeben werden.

Listing 1: Run Tests

$ make TEST_PHP_ARGS=-j`nproc` test ... ================================================ TEST RESULT SUMMARY --------------------------------------------------------------------- Exts skipped : 46 Exts tested : 26 --------------------------------------------------------------------- Number of tests : 15670 10668 Tests skipped : 5002 ( 31.9%) -------- Tests warned : 0 ( 0.0%) ( 0.0%) Tests failed : 0 ( 0.0%) ( 0.0%) Expected fail : 32 ( 0.2%) ( 0.3%) Tests passed : 10636 ( 67.9%) ( 99.7%) --------------------------------------------------------------------- Time taken : 76 seconds ================================================

Das Ergebnis in Listing 1 sieht gut aus. Es dauerte nur 76 Sekunden, um 1 0636 Tests durchzuführen, das ist ziemlich schnell. Keine Warnungen und keine Fehler! Man kann zudem sehen, dass 5 002 Tests übersprungen wurden und 32 bewusst fehlschlugen. Warum das so ist, erfahren wir im nächsten Abschnitt.

Wie sehen die Tests aus?

Betrachten wir nun, wie ein solcher Testfall aussehen kann. PHP-Testdateien (Listing 2) haben die Dateiendung .phpt und bestehen aus mehreren Abschnitten, von denen drei obligatorisch sind:

  • TEST

  • FILE

  • EXPECT oder EXPECTF

Der Abschnitt TEST ist eine kurze Beschreibung dessen, was wir testen. Diese Beschreibung sollte so kurz wie möglich sein, da sie bei der Durchführung der Tests ausgegeben wird. Zusätzliche Details können im Abschnitt DESCRIPTION angegeben werden.

Listing 2: Example PHPT File

--TEST-- strlen() function --FILE-- <?php var_dump(strlen('Hello World!')); ?> --EXPECT-- int(12)

Der Abschnitt SKIPIF ist optional und wird von PHP ausgeführt. Wenn die resultierende Ausgabe mit dem Wort skip beginnt, wird der Testfall übersprungen. Beginnt die Ausgabe mit xfail, wird der Testfall zwar ausgeführt, aber es wird erwartet, dass er fehlschlägt. Hauptanwendungsfall hierfür ist die Überprüfung, ob eine erforderliche Erweiterung installiert ist.

Der Abschnitt FILE ist der eigentliche Testfall und besteht aus von PHP-Tags umschlossenem PHP-C...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang