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 bestandens
– Test wurde übersprungenF
– 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 gedrucktconsole-lines
: ähnlich wie die Konsole, aber das Ergebnis jedes Tests wird in einer separaten Zeile mit weiteren Informationen angezeigttap
: TAP-Format, geeignet für die maschinelle Verarbeitungjunit
: JUnit XML-Format, auch für die maschinelle Verarbeitung geeignetlog
: Gibt den Testfortschritt aus. Alle fehlgeschlagenen, übersprungenen und auch erfolgreichen Testsnone
: 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:
- PCOV
- PHPDBG
- 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.