Laufende Tests

Der sichtbarste Teil von Nette Tester ist der Kommandozeilen-Test-Runner. Er ist extrem schnell und robust, weil er automatisch alle Tests als separate Prozesse parallel in mehreren Threads startet. Er kann auch selbst im sogenannten Watch-Modus laufen.

Der Nette Tester Test Runner wird über die Kommandozeile aufgerufen. Als Parameter übergeben wir das Testverzeichnis. Für das aktuelle Verzeichnis geben wir einfach einen Punkt ein:

vendor/bin/tester .

Beim Aufruf durchsucht der Testrunner das angegebene Verzeichnis und alle Unterverzeichnisse und sucht nach Tests, d. h. nach den Dateien *.phpt und *Test.php. Er liest auch deren Anmerkungen und wertet sie aus, um zu wissen, welche und wie sie ausgeführt werden sollen.

Anschließend führt er die Tests aus. Für jeden durchgeführten Test gibt der Läufer ein Zeichen aus, um den Fortschritt anzuzeigen:

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

Die Ausgabe kann wie folgt 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 einem erneuten Durchlauf werden zuerst die Tests ausgeführt, die beim vorherigen Durchlauf fehlgeschlagen sind, so dass Sie sofort wissen, ob Sie den Fehler behoben haben.

Der Exit-Code des Testers ist Null, wenn keiner der Tests fehlschlägt. Andernfalls ungleich Null.

Der Tester führt PHP-Prozesse ohne php.ini aus. Weitere Einzelheiten finden Sie im Abschnitt Eigene php.ini.

Kommandozeilen-Optionen

Einen Überblick über die Kommandozeilenoptionen erhalten wir, indem wir den Tester ohne Parameter oder mit der Option -h ausführen:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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> (z. B. -o junit:output.xml)
                                 Geben Sie ein oder mehrere Ausgabeformate mit optionalem Dateinamen an.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Pfad zum temporären Verzeichnis. Vorgabe durch 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-Binärdatei an, die für die Ausführung 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 bei der Ausführung von Tests verwendet wird. Standardmäßig wird keine php.ini verwendet. Siehe Eigene php.ini für weitere Informationen.

-C

Es wird eine systemweite php.ini verwendet. Auf der UNIX-Plattform also auch alle /etc/php/{sapi}/conf.d/*.ini -Dateien. Siehe Abschnitt Eigene php.ini.

-d <key=value>

Legt den Wert der PHP-Konfigurationsrichtlinie für Tests fest. Der Parameter kann mehrfach verwendet werden.

tester -d max_execution_time=20

-s

Es werden Informationen über übersprungene Tests angezeigt.

--stop-on-fail

Der Tester bricht den Test ab, sobald der erste Test fehlschlägt.

-j <num>

Tests laufen in einem <num> parallel abläuft. Der Standardwert ist 8. Wenn wir die Tests in Serie laufen lassen wollen, verwenden wir den Wert 1.

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

Ausgabeformat. Standardmäßig wird das Konsolenformat verwendet. Sie können den Namen der Datei angeben, in die die Ausgabe geschrieben werden soll (z. B. -o junit:output.xml). Die Option -o kann mehrmals wiederholt werden, um mehrere Formate auf einmal zu erzeugen.

  • console: wie Standard, aber das ASCII-Logo wird in diesem Fall nicht gedruckt
  • console-lines: ähnlich wie die Konsole, aber das Ergebnis jedes Tests wird in einer separaten Zeile mit weiteren Informationen angezeigt
  • tap: TAP-Format, geeignet für die maschinelle Verarbeitung
  • junit: JUnit XML-Format, auch für die maschinelle Verarbeitung geeignet
  • log: Gibt den Testfortschritt aus. Alle fehlgeschlagenen, übersprungenen und auch erfolgreichen Tests
  • none: es wird nichts gedruckt

-w | --watch <path>

Der Tester wird nicht beendet, wenn die Tests abgeschlossen sind, sondern er führt die PHP-Dateien im angegebenen Verzeichnis weiter aus und beobachtet sie. Bei einer Änderung führt er die Tests erneut aus. Der Parameter kann mehrfach verwendet werden, wenn wir mehrere Verzeichnisse überwachen wollen.

Dies ist praktisch beim Refactoring einer Bibliothek oder beim Debuggen von Tests.

tester --watch src tests

-i | --info

Zeigt Informationen über eine Testumgebung 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>

Der Tester lädt das angegebene PHP-Skript beim Start. Darin ist die Variable Tester\Runner\Runner $runner verfügbar. Nehmen wir an, die Datei tests/runner-setup.php:

$runner->outputHandlers[] = new MyOutputHandler;

und wir führen den Tester aus:

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

--temp <path>

Legt einen Pfad zum Verzeichnis für temporäre Dateien des Testers fest. Der Standardwert wird von sys_get_temp_dir() zurückgegeben. Wenn der Standardwert nicht gültig ist, werden Sie darauf hingewiesen.

Wenn wir nicht sicher sind, welches Verzeichnis verwendet wird, können wir Tester mit dem Parameter --info ausführen.

--Farben 1|0

Der Tester erkennt standardmäßig ein farbfähiges Terminal und färbt seine Ausgabe ein. Diese Option ist über die automatische Erkennung. Wir können die Farbgebung global durch eine Systemumgebungsvariable NETTE_TESTER_COLORS einstellen.

--coverage <path>

Der Tester generiert einen Bericht mit einer Übersicht, wie weit der Quellcode von den Tests abgedeckt ist. Für diese Option muss die PHP-Erweiterung Xdebug oder PCOV aktiviert sein, oder PHP 7 mit dem PHPDBG SAPI, das schneller ist. Die Zieldateierweiterung bestimmt das Format des Inhalts. HTML oder Clover XML.

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

Die Priorität für die Auswahl des Sammelmechanismus ist die folgende:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Umfangreiche Tests können während der Ausführung durch PHPDBG aufgrund von Speichererschöpfung fehlschlagen. Das Sammeln von Abdeckungsdaten ist ein speicherintensiver Vorgang. In diesem Fall kann der Aufruf von Tester\CodeCoverage\Collector::flush() innerhalb eines Tests helfen. Dadurch werden die gesammelten Daten in eine Datei geschrieben und der Speicher wird freigegeben. Wenn die Datenerfassung nicht läuft oder Xdebug verwendet wird, hat der Aufruf keine Auswirkungen.

Ein Beispiel für einen HTML-Bericht mit Codeabdeckung.

--coverage-src <path>

Wir verwenden sie gleichzeitig mit der Option --coverage. Die <path> ist ein Pfad zum Quellcode, für den wir den Bericht erstellen. Er kann wiederholt verwendet werden.

Eigene php.ini

Der Tester führt PHP-Prozesse mit der Option -n aus, was bedeutet, dass keine php.ini geladen wird (nicht einmal die von /etc/php/conf.d/*.ini in UNIX). Dies gewährleistet die gleiche Umgebung für die ausgeführten Tests, aber es deaktiviert auch alle externen PHP-Erweiterungen, die üblicherweise von System-PHP geladen werden.

Wenn Sie die Systemkonfiguration beibehalten wollen, verwenden Sie den Parameter -C.

Wenn Sie einige Erweiterungen oder spezielle INI-Einstellungen benötigen, empfehlen wir Ihnen, eine eigene php.ini Datei zu erstellen und diese auf die Tests zu verteilen. Dann führen wir Tester mit der Option -c aus, z.B. tester -c tests/php.ini. Die INI-Datei kann wie folgt aussehen:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Wenn Sie den Tester mit einem System php.ini unter UNIX ausführen, z. B. tester -c /etc/php/cgi/php.ini, wird keine andere INI-Datei von /etc/php/conf.d/*.ini geladen. Das ist das Verhalten von PHP, nicht das des Testers.