Tests ausführen

Der sichtbarste Teil von Nette Tester ist der Test-Runner für die Kommandozeile. Er ist außerordentlich schnell und robust, weil er alle Tests automatisch als eigene Prozesse parallel in mehreren Threads ausführt. Er kann sich außerdem selbst im Watch-Modus ausführen.

Der Test-Runner wird von der Kommandozeile aus aufgerufen. Übergeben Sie als Parameter das Verzeichnis mit den Tests. Für das aktuelle Verzeichnis genügt ein Punkt:

vendor/bin/tester .

Der Test-Runner durchsucht das angegebene Verzeichnis und alle seine Unterverzeichnisse nach Tests, also nach Dateien, die auf *.phpt oder *Test.php enden. Außerdem liest und wertet er ihre Annotationen aus, um zu bestimmen, welche Tests wie ausgeführt werden.

Jede Testdatei läuft in ihrem eigenen isolierten PHP-Prozess, und der Runner führt mehrere davon gleichzeitig aus – die Einheit der Parallelität ist also die Datei. Der Code innerhalb einer Datei läuft deshalb nacheinander ab. Ein TestCase lebt in einer Datei, seine Methoden laufen also standardmäßig nacheinander in einem Prozess; kennzeichnen Sie ihn mit der Annotation @testCase, damit der Runner stattdessen jede Testmethode als eigenen parallelen Prozess ausführt.

Danach führt er die Tests aus. Während der Ausführung gibt er Zeichen im Terminal aus, die den Fortschritt anzeigen:

  • . – Test bestanden
  • s – Test wurde übersprungen
  • F – Test fehlgeschlagen

Die Ausgabe kann so aussehen:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.6.1

PHP 8.5.2 (cli) | php | 8 threads

........s..........................

OK (35 tests, 1 skipped, 1.7 seconds)

Beim erneuten Lauf führt er zuerst die Tests aus, die im vorigen Lauf fehlgeschlagen sind, sodass Sie sofort wissen, ob Sie den Fehler behoben haben.

Der Exit-Code von Tester ist null, wenn kein Test fehlschlägt. Andernfalls ist er ungleich null.

Kommandozeilenparameter

Eine Übersicht der Kommandozeilenparameter erhalten Sie, indem Sie Tester ohne Parameter oder mit der Option -h starten:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.6.1

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Use custom php.ini, ignore system configuration.
    -C                           With -c, include system configuration as well.
    -d <key=value>...            Define INI entry 'key' with value 'value'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|log|none>  (e.g. -o junit:output.xml)
                                 Specify one or more output formats with optional file name.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.

-p <path>

Gibt die PHP-Binary an, mit der die Tests ausgeführt werden. Standardmäßig ist das php.

tester -p /home/user/php-7.2.0-beta/php-cgi tests

-c <path>

Verwendet eine eigene Datei php.ini und ignoriert die Systemkonfiguration. Das ist nützlich, um Tests mit bestimmten Einstellungen auszuführen. Mehr dazu unter Eigene php.ini.

-C

Zusammen mit -c verwendet, bezieht auch die Systemkonfiguration mit ein (ignoriert sie also nicht). Siehe den Abschnitt Eigene php.ini.

-d <key=value>

Setzt den Wert einer PHP-Konfigurationsdirektive für die Tests. Dieser Parameter kann mehrfach verwendet werden.

tester -d max_execution_time=20

-s

Zeigt Informationen über übersprungene Tests an.

--stop-on-fail

Tester bricht das Testen beim ersten fehlgeschlagenen Test ab.

-j <num>

Gibt die Anzahl der parallelen Prozesse an, in denen die Tests laufen. Der Standardwert ist 8. Um die Tests nacheinander auszuführen, verwenden Sie den Wert 1.

-o <console|console-lines|tap|junit|log|none>

Legt das Ausgabeformat fest. Der Standard ist das Konsolenformat. Sie können den Namen der Datei angeben, in die die Ausgabe geschrieben wird (z. B. -o junit:output.xml). Die Option -o lässt sich mehrfach wiederholen, um mehrere Formate auf einmal zu erzeugen.

  • console: wie das Standardformat, nur wird in diesem Fall das ASCII-Logo nicht ausgegeben
  • console-lines: ähnlich wie console, aber das Ergebnis jedes Tests steht mit zusätzlichen Informationen in einer eigenen Zeile
  • tap: TAP-Format, für die maschinelle Verarbeitung geeignet
  • junit: JUnit-XML-Format, ebenfalls für die maschinelle Verarbeitung geeignet
  • log: Gibt den Verlauf des Testens aus. Enthält alle fehlgeschlagenen, übersprungenen und auch erfolgreichen Tests
  • none: es wird nichts ausgegeben

-w | --watch <path>

Nach Abschluss der Tests beendet sich Tester nicht, sondern läuft weiter und beobachtet die PHP-Dateien im angegebenen Verzeichnis. Ändert sich eine Datei, führt er die Tests erneut aus. Dieser Parameter lässt sich mehrfach verwenden, wenn Sie mehrere Verzeichnisse beobachten wollen.

Nützlich beim Refactoring einer Bibliothek oder beim Debuggen von Tests.

tester --watch src tests

-i | --info

Zeigt Informationen über die Laufzeitumgebung der Tests an. Zum Beispiel:

tester -p /usr/bin/php7.1 -c tests/php.ini --info

PHP binary:
/usr/bin/php7.1

PHP version:
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

Code coverage engines:
(not available)

Loaded php.ini files:
/var/www/dev/demo/tests/php.ini

PHP temporary directory:
/tmp

Loaded extensions:
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...

--setup <path>

Tester lädt beim Start das angegebene PHP-Skript. Innerhalb dieses Skripts steht die Variable Tester\Runner\Runner $runner zur Verfügung. Nehmen wir eine Datei tests/runner-setup.php mit folgendem Inhalt an:

$runner->outputHandlers[] = new MyOutputHandler;

Wir starten Tester mit:

tester --setup tests/runner-setup.php tests

--temp <path>

Setzt den Pfad zum Verzeichnis für die temporären Dateien von Tester. Den Standardwert liefert sys_get_temp_dir(). Sie werden benachrichtigt, wenn der Standardwert nicht gültig ist.

Wenn Sie sich nicht sicher sind, welches Verzeichnis verwendet wird, starten Sie Tester mit dem Parameter --info.

--colors 1|0

Standardmäßig erkennt Tester, ob das Terminal Farben unterstützt, und färbt seine Ausgabe entsprechend ein. Diese Option überschreibt die automatische Erkennung. Sie können die Färbung global über die Umgebungsvariable NETTE_TESTER_COLORS einstellen.

--coverage <path>

Tester erzeugt einen Bericht darüber, wie viel des Quellcodes von Tests abgedeckt ist. Diese Option erfordert die installierte PHP-Extension Xdebug oder PCOV oder die schnellere SAPI PHPDBG. Die Endung der Zieldatei bestimmt ihr Format: HTML oder Clover XML.

tester tests --coverage coverage.html  # HTML-Bericht
tester tests --coverage coverage.xml   # Clover-XML-Bericht

Die Reihenfolge bei der Auswahl der Coverage-Engine ist wie folgt:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Bei der Verwendung von PHPDBG können umfangreiche Tests wegen erschöpftem Speicher fehlschlagen. Das Sammeln der Informationen zur Code Coverage ist speicherintensiv. In diesem Fall kann ein Aufruf von Tester\CodeCoverage\Collector::flush() in Ihrem Test helfen. Er schreibt die gesammelten Daten auf die Festplatte und gibt Speicher frei. Der Aufruf wirkt nur mit der Engine PHPDBG; mit PCOV, Xdebug oder wenn keine Datensammlung läuft, tut er nichts.

Sehen Sie sich einen `Beispiel-HTML-Bericht mit der Code Coverage an.

--coverage-src <path>

Wird zusammen mit der Option --coverage verwendet. <path> ist der Pfad zum Quellcode, für den der Bericht erzeugt wird. Kann mehrfach verwendet werden.

Eigene php.ini

Sie können für Ihre Tests eine eigene Datei php.ini verwenden. Wenn Sie bestimmte Extensions oder besondere INI-Einstellungen brauchen, empfehlen wir, eine eigene Datei php.ini anzulegen und mit Ihren Tests auszuliefern. Starten Sie Tester dann mit der Option -c, zum Beispiel tester -c tests/php.ini tests. Die INI-Datei kann so aussehen:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Bei der Verwendung von -c ignoriert Tester die Systemkonfiguration (startet PHP mit dem Flag -n). Wenn Sie die Systemkonfiguration ebenfalls einbeziehen wollen, ergänzen Sie die Option -C: tester -c tests/php.ini -C tests. Auch bei der Kombination von -c und -C werden unter UNIX die weiteren INI-Dateien aus /etc/php/conf.d/*.ini nicht geladen. Das ist ein Verhalten von PHP und nicht spezifisch für Tester.

Vor Version 2.6 startete Tester PHP ohne -c mit dem Flag -n, also ohne php.ini; die Option -C unterdrückte das. Ab Version 2.6 wird die System-php.ini standardmäßig geladen. Das Verhalten bei der Verwendung von -c bleibt unverändert.