Erste Schritte mit Nette Tester
Auch gute Programmierer machen Fehler. Der Unterschied zwischen einem guten und einem schlechten Programmierer besteht darin, dass der gute ihn nur einmal macht und ihn das nächste Mal mit automatisierten Tests aufdeckt.
- “Wer nicht testet, ist dazu verdammt, seine Fehler zu wiederholen.” (Sprichwort)
- “Sobald wir einen Fehler beseitigen, taucht ein weiterer auf.” (Murphys Gesetz)
- “Wann immer Sie den Drang verspüren, eine Variable auf dem Bildschirm auszugeben, schreiben Sie lieber einen Test.” (Martin Fowler)
Haben Sie schon einmal einen ähnlichen Code in PHP geschrieben?
$obj = new MyClass;
$result = $obj->process($input);
var_dump($result);
Also haben Sie das Ergebnis eines Funktionsaufrufs ausgegeben, nur um mit bloßem Auge zu überprüfen, ob es das zurückgibt, was es soll? Sicherlich tun Sie das mehrmals täglich. Hand aufs Herz: Wenn alles richtig funktioniert, löschen Sie diesen Code? Erwarten Sie, dass die Klasse in Zukunft nicht kaputt geht? Murphys Gesetze garantieren das Gegenteil :-)
Im Grunde haben Sie einen Test geschrieben. Sie müssen ihn nur geringfügig anpassen, damit er keine Sichtprüfung erfordert, sondern sich selbst überprüft. Und wenn Sie den Test nicht löschen, können Sie ihn jederzeit in Zukunft ausführen und überprüfen, ob alles noch so funktioniert, wie es soll. Mit der Zeit werden Sie eine große Anzahl solcher Tests erstellen, daher wäre es nützlich, sie automatisiert auszuführen.
Und genau dabei hilft Ihnen Nette Tester.
Was macht Tester einzigartig?
Das Schreiben von Tests für Nette Tester ist einzigartig, denn jeder Test ist ein gewöhnliches PHP-Skript, das separat ausgeführt werden kann.
Das heißt, wenn Sie einen Test schreiben, können Sie ihn einfach ausführen und feststellen, ob darin vielleicht ein Programmierfehler steckt. Ob er richtig funktioniert. Wenn nicht, können Sie ihn leicht in Ihrer IDE debuggen und den Fehler suchen. Sie können ihn sogar im Browser öffnen.
Und vor allem – indem Sie ihn ausführen, führen Sie den Test durch. Sie erfahren sofort, ob er bestanden hat oder
fehlgeschlagen ist. Wie? Lassen Sie es uns zeigen. Wir schreiben einen trivialen Test zur Arbeit mit einem PHP-Array und speichern
ihn in der Datei ArrayTest.php
:
<?php
use Tester\Assert;
require __DIR__ . '/vendor/autoload.php'; # Composer Autoloader laden
Tester\Environment::setup(); # Initialisierung von Nette Tester
$stack = [];
Assert::same(0, count($stack)); # wir erwarten, dass count() Null zurückgibt
$stack[] = 'foo';
Assert::same(1, count($stack)); # wir erwarten, dass count() Eins zurückgibt
Assert::contains('foo', $stack); # überprüfen, ob $stack das Element 'foo' enthält
Wie Sie sehen, werden sogenannte Assertion-Methoden wie
Assert::same()
verwendet, um zu bestätigen, dass der tatsächliche Wert dem erwarteten Wert entspricht.
Der Test ist geschrieben und wir können ihn von der Kommandozeile aus starten. Der erste Start deckt eventuelle Syntaxfehler auf, und wenn Sie keinen Tippfehler gemacht haben, wird Folgendes ausgegeben:
$ php ArrayTest.php
OK
Versuchen Sie, im Test die Assertion auf einen falschen Wert zu ändern: Assert::contains('XXX', $stack);
und
beobachten Sie, was beim Start passiert:
$ php ArrayTest.php Failed: ['foo'] should contain 'XXX' in ArrayTest.php(17) Assert::contains('XXX', $stack); FAILURE
Weiter geht es mit dem Schreiben im Kapitel Tests schreiben.
Installation und Anforderungen
Die minimale PHP-Version, die von Tester benötigt wird, ist 7.1 (genauer in der Tabelle unterstützte PHP-Versionen). Die bevorzugte Installationsmethode ist über Composer:
composer require --dev nette/tester
Versuchen Sie, Nette Tester von der Kommandozeile aus zu starten (ohne Parameter wird nur die Hilfe ausgegeben):
vendor/bin/tester
Tests ausführen
Mit wachsender Anwendung wächst auch die Anzahl der Tests. Es wäre unpraktisch, Tests einzeln auszuführen. Daher verfügt Tester über einen Massen-Teststarter, den wir von der Kommandozeile aus aufrufen. Als Parameter geben wir das Verzeichnis an, in dem sich die Tests befinden. Ein Punkt bedeutet das aktuelle Verzeichnis.
vendor/bin/tester .
Der Teststarter durchsucht das angegebene Verzeichnis und alle Unterverzeichnisse und sucht nach Tests, d. h. Dateien
*.phpt
und *Test.php
. Er findet also auch unseren Test ArrayTest.php
, da er dem Muster
entspricht.
Dann startet er das Testen. Jeder Test wird als neuer PHP-Prozess gestartet, sodass er völlig isoliert von den anderen abläuft. Er führt sie parallel in mehreren Threads aus und ist dadurch extrem schnell. Und er führt zuerst die Tests aus, die beim vorherigen Durchlauf fehlgeschlagen sind, sodass Sie sofort erfahren, ob es Ihnen gelungen ist, den Fehler zu beheben.
Während der Durchführung der Tests gibt Tester die Ergebnisse kontinuierlich als Zeichen auf dem Terminal aus:
.
– Test bestandens
– Test übersprungen (skipped)F
– Test fehlgeschlagen (failed)
Die Ausgabe kann so aussehen:
_____ ___ ___ _____ ___ ___ |_ _/ __)( __/_ _/ __)| _ ) |_| \___ /___) |_| \___ |_|_\ v2.5.2 Note: No php.ini is used. PHP 8.3.2 (cli) | php -n | 8 threads ........s................F......... -- FAILED: greeting.phpt Failed: 'Hello John' should be ... 'Hello Peter' in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John')); FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)
Es wurden 35 Tests ausgeführt, einer ist fehlgeschlagen, einer wurde übersprungen.
Weiter geht es im Kapitel Tests ausführen.
Watch-Modus
Refaktorieren Sie Code? Oder entwickeln Sie sogar nach der TDD-Methodik (Test Driven Development)? Dann wird Ihnen der Watch-Modus gefallen. Tester überwacht darin die Quellcodes und startet sich bei Änderungen selbst.
Während der Entwicklung haben Sie also in der Ecke des Monitors ein Terminal, auf dem die grüne Statusleiste leuchtet, und wenn sie plötzlich rot wird, wissen Sie, dass Sie gerade etwas nicht ganz richtig gemacht haben. Es ist eigentlich ein tolles Spiel, bei dem Sie programmieren und versuchen, die Farbe zu halten.
Der Watch-Modus wird mit dem Parameter –watch gestartet.
CodeCoverage-Berichte
Tester kann Berichte mit einer Übersicht darüber generieren, wie viel Quellcode die Tests abdecken. Der Bericht kann entweder im menschenlesbaren HTML-Format oder als Clover XML zur weiteren maschinellen Verarbeitung vorliegen.
Sehen Sie sich ein Beispiel für einen HTML-Bericht mit Codeabdeckung an.
Unterstützte PHP-Versionen
Version | Kompatibel mit PHP |
---|---|
Tester 2.5 | PHP 8.0 – 8.3 |
Tester 2.4 | PHP 7.2 – 8.2 |
Tester 2.3 | PHP 7.1 – 8.0 |
Tester 2.1 – 2.2 | PHP 7.1 – 7.3 |
Tester 2.0 | PHP 5.6 – 7.3 |
Tester 1.7 | PHP 5.3 – 7.3 + HHVM 3.3+ |
Tester 1.6 | PHP 5.3 – 7.0 + HHVM |
Tester 1.3 – 1.5 | PHP 5.3 – 5.6 + HHVM |
Tester 0.9 – 1.2 | PHP 5.3 – 5.6 |
Gilt für die letzte Patch-Version.
Tester bis Version 1.7 unterstützte auch HHVM 3.3.0 oder höher (über
tester -p hhvm
). Die Unterstützung wurde ab Tester Version 2.0 eingestellt.