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 bestanden
  • s – 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.