Tests ausführen

Der sichtbarste Teil von Nette Tester ist der Test-Runner für die Kommandozeile. Er ist außergewöhnlich schnell und robust, da er alle Tests automatisch als separate Prozesse startet, und das parallel in mehreren Threads. Er kann sich auch selbst im sogenannten Watch-Modus starten.

Der Test-Runner wird von der Kommandozeile aus aufgerufen. Als Parameter geben wir das Verzeichnis mit den Tests an. Für das aktuelle Verzeichnis genügt ein Punkt:

vendor/bin/tester .

Der Test-Runner durchsucht das angegebene Verzeichnis und alle Unterverzeichnisse und sucht nach Tests, das sind Dateien *.phpt und *Test.php. Gleichzeitig liest und wertet er deren Annotationen aus, um zu wissen, welche davon und wie sie ausgeführt werden sollen.

Danach führt er die Tests aus. Während der Ausführung der Tests gibt er die Ergebnisse kontinuierlich als Zeichen auf dem Terminal aus:

  • . – Test bestanden
  • s – Test übersprungen (skipped)
  • F – Test fehlgeschlagen (failed)

Die Ausgabe kann beispielsweise so aussehen:

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

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

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

OK (35 tests, 1 skipped, 1.7 seconds)

Bei wiederholter Ausführung führt er zuerst die Tests aus, die beim vorherigen Durchlauf fehlgeschlagen sind, sodass Sie sofort erfahren, ob es Ihnen gelungen ist, den Fehler zu beheben.

Wenn kein Test fehlschlägt, ist der Rückgabecode von Tester Null. Andernfalls ist der Rückgabecode ungleich Null.

Tester startet PHP-Prozesse ohne php.ini. Details im Abschnitt Eigene php.ini.

Kommandozeilenparameter

Eine Übersicht aller Kommandozeilenoptionen erhalten Sie, indem Sie Tester ohne Parameter oder mit dem Parameter -h starten:

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

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

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Look for php.ini file (or look in directory) <path>.
    -C                           Use system-wide php.ini.
    -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 den PHP-Interpreter an, der zum Ausführen der Tests verwendet wird. Standardmäßig ist dies php.

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

-c <path>

Gibt an, welche php.ini beim Ausführen der Tests verwendet wird. Standardmäßig wird keine php.ini verwendet. Mehr im Abschnitt Eigene php.ini.

-C

Verwendet die systemweite php.ini. Unter UNIX auch alle relevanten INI-Dateien /etc/php/{sapi}/conf.d/*.ini. Mehr im Abschnitt Eigene php.ini.

-d <key=value>

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

tester -d max_execution_time=20

-s

Zeigt Informationen über übersprungene Tests an.

--stop-on-fail

Tester stoppt die Testausführung beim ersten fehlgeschlagenen Test.

-j <num>

Gibt an, wie viele parallele Prozesse mit Tests gestartet werden. Der Standardwert ist 8. Wenn wir möchten, dass alle Tests seriell ausgeführt werden, verwenden wir den Wert 1.

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

Legt das Ausgabeformat fest. Standard ist das Konsolenformat. Sie können einen Dateinamen angeben, in den die Ausgabe geschrieben wird (z. B. -o junit:output.xml). Die Option -o kann mehrfach wiederholt werden, um mehrere Formate gleichzeitig zu generieren.

  • console: Identisch mit dem Standardformat, aber in diesem Fall wird das ASCII-Logo nicht angezeigt.
  • console-lines: Ähnlich wie console, aber das Ergebnis jedes Tests wird in einer separaten Zeile mit weiteren Informationen angezeigt.
  • tap: TAP-Format, geeignet für maschinelle Verarbeitung.
  • junit: JUnit-XML-Format, ebenfalls für maschinelle Verarbeitung geeignet.
  • log: Ausgaben des Testverlaufs. Alle fehlgeschlagenen, übersprungenen und auch erfolgreichen Tests.
  • none: Es wird nichts ausgegeben.

-w | --watch <path>

Nach Abschluss der Tests beendet sich Tester nicht, sondern bleibt laufen und überwacht PHP-Dateien im angegebenen Verzeichnis. Bei einer Änderung führt er die Tests erneut aus. Der Parameter kann mehrfach verwendet werden, wenn wir mehrere Verzeichnisse überwachen möchten.

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

tester --watch src tests

-i | --info

Zeigt Informationen zur Laufzeitumgebung für die 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. Darin steht die Variable Tester\Runner\Runner $runner zur Verfügung. Angenommen, die Datei tests/runner-setup.php hat folgenden Inhalt:

$runner->outputHandlers[] = new MyOutputHandler;

Wir starten Tester:

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

--temp <path>

Legt den Pfad zum Verzeichnis für temporäre Dateien von Tester fest. Der Standardwert wird von sys_get_temp_dir() zurückgegeben. Wenn der Standardwert ungültig ist, werden Sie benachrichtigt.

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

--colors 1|0

Standardmäßig erkennt Tester ein farbiges Terminal und färbt seine Ausgabe ein. Diese Option überschreibt die Autodetektion. Global können wir die Farbgebung über die Systemumgebungsvariable NETTE_TESTER_COLORS einstellen.

--coverage <path>

Tester generiert einen Bericht mit einer Übersicht darüber, wie viel Quellcode die Tests abdecken. Diese Option erfordert die installierte PHP-Erweiterung Xdebug oder PCOV oder PHP 7 mit PHPDBG SAPI, das schneller ist. Die Dateierweiterung der Zieldatei bestimmt ihr Format. Entweder HTML oder Clover XML.

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

Die Priorität bei der Auswahl des Mechanismus ist wie folgt:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Bei Verwendung von PHPDBG können bei umfangreichen Tests Fehler aufgrund von Speichermangel auftreten. Die Sammlung von Informationen über abgedeckten Code ist speicherintensiv. In diesem Fall hilft der Aufruf von Tester\CodeCoverage\Collector::flush() innerhalb des Tests. Er schreibt die gesammelten Daten auf die Festplatte und gibt Speicher frei. Wenn keine Datensammlung stattfindet oder Xdebug verwendet wird, hat der Aufruf keine Auswirkung.

Beispiel für einen HTML-Bericht mit Codeabdeckung.

--coverage-src <path>

Wird gleichzeitig mit der Option --coverage verwendet. <path> ist der Pfad zu den Quellcodes, für die der Bericht generiert wird. Kann wiederholt verwendet werden.

Eigene php.ini

Tester startet PHP-Prozesse mit dem Parameter -n, was bedeutet, dass keine php.ini geladen wird. Unter UNIX auch nicht die aus /etc/php/conf.d/*.ini. Dies gewährleistet eine einheitliche Umgebung für die Ausführung der Tests, deaktiviert aber auch alle PHP-Erweiterungen, die normalerweise vom System-PHP geladen werden.

Wenn Sie das Laden der systemweiten php.ini-Dateien beibehalten möchten, verwenden Sie den Parameter -C.

Wenn Sie Erweiterungen oder spezielle INI-Einstellungen für Tests benötigen, empfehlen wir die Erstellung einer eigenen php.ini-Datei, die mit den Tests verteilt wird. Tester wird dann mit dem Parameter -c gestartet, zum Beispiel tester -c tests/php.ini tests, wobei die INI-Datei wie folgt aussehen kann:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Das Starten von Tester unter UNIX mit einer systemweiten php.ini, zum Beispiel tester -c /etc/php/cli/php.ini, lädt nicht die anderen INIs aus /etc/php/conf.d/*.ini. Dies ist eine Eigenschaft von PHP, nicht von Tester.