Erste Schritte mit Tester

Auch gute Programmierer machen Fehler. Der Unterschied zwischen einem guten und einem schlechten Programmierer besteht darin, dass ein guter Programmierer den Fehler nur einmal macht und ihn beim nächsten Mal mit Hilfe automatisierter Tests entdeckt.

  • “Wer nicht testet, ist dazu verdammt, seine eigenen Fehler zu wiederholen.” (weises Sprichwort)
  • “Wenn wir einen Fehler beseitigt haben, taucht ein neuer auf.” (Murphy's Law)
  • “Wann immer Sie in Versuchung kommen, eine Anweisung zu drucken, schreiben Sie sie stattdessen als Test.” (Martin Fowler)

Haben Sie jemals den folgenden Code in PHP geschrieben?

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

Haben Sie schon einmal das Ergebnis eines Funktionsaufrufs ausgegeben, nur um mit dem Auge zu prüfen, ob er das liefert, was er liefern sollte? Sie tun das sicherlich viele Male am Tag. Hand aufs Herz, wenn alles funktioniert, löschen Sie dann diesen Code und erwarten, dass die Klasse in Zukunft nicht mehr kaputt geht? Murphy's Law garantiert das Gegenteil :-)

Tatsächlich haben Sie den Test geschrieben. Er muss nur geringfügig geändert werden, damit er nicht von uns überprüft werden muss, sondern sich einfach selbst überprüfen kann. Und wenn Sie ihn nicht gelöscht haben, können wir ihn jederzeit in der Zukunft ausführen, um zu überprüfen, ob alles noch so funktioniert, wie es sollte. Möglicherweise erstellen Sie im Laufe der Zeit eine große Anzahl dieser Tests, so dass es schön wäre, wenn wir sie automatisch ausführen könnten.

Und genau dabei hilft Nette Tester.

Was macht Tester so einzigartig?

Das Schreiben von Tests für Nette Tester ist einzigartig, da jeder Test ein Standard-PHP-Skript ist, das eigenständig ausgeführt werden kann.

Wenn Sie also einen Test schreiben, können Sie ihn einfach ausführen, um zu sehen, ob es einen Programmierfehler gibt. Wenn er richtig funktioniert. Wenn nicht, können Sie das Programm einfach in Ihrer IDE durchgehen und nach einem Fehler suchen. Sie können es sogar in einem Browser öffnen.

Und das Wichtigste – wenn Sie es ausführen, führen Sie den Test durch. Sie werden sofort erfahren, ob er bestanden hat oder nicht. Wie das geht? Schauen wir uns das an. Schreiben wir einen trivialen Test für die Verwendung eines PHP-Arrays und speichern wir ihn in der Datei ArrayTest.php:

<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php';  # load Composer autoloader
Tester\Environment::setup();               # initialization of Nette Tester

$stack = [];
Assert::same(0, count($stack));   # we expect count() to return zero

$stack[] = 'foo';
Assert::same(1, count($stack));   # we expect count() to return one
Assert::contains('foo', $stack);  # verify that the $stack contains the item 'foo'

Wie Sie sehen können, werden Assertion-Methoden wie Assert::same() verwendet, um zu bestätigen, dass ein tatsächlicher Wert mit einem erwarteten Wert übereinstimmt.

Der Test ist geschrieben, wir können ihn über die Befehlszeile ausführen. Beim ersten Durchlauf werden alle Syntaxfehler aufgedeckt, und wenn Sie keinen Tippfehler gemacht haben, werden Sie sehen:

$ php ArrayTest.php

OK

Versuchen Sie, die Anweisung im Test in Assert::contains('XXX', $stack); zu ändern und beobachten Sie, was bei der Ausführung passiert:

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

Wir fahren mit dem Kapitel Schreiben von Tests fort.

Installation und Anforderungen

Die minimal erforderliche PHP-Version für Tester ist 7.1 (weitere Details finden Sie in der Tabelle der unterstützten PHP-Versionen ). Die bevorzugte Art der Installation ist die über Composer:

composer require --dev nette/tester

Versuchen Sie, den Nette Tester von der Kommandozeile aus zu starten (ohne Argumente wird nur eine Hilfezusammenfassung angezeigt):

vendor/bin/tester

Tests ausführen

Wenn unsere Anwendung wächst, wächst auch die Anzahl der Tests. Es wäre unpraktisch, die Tests einzeln auszuführen. Daher verfügt der Tester über einen Bulk-Test-Runner, den wir über die Befehlszeile aufrufen. Der Parameter ist das Verzeichnis, in dem sich die Tests befinden. Der Punkt zeigt das aktuelle Verzeichnis an.

vendor/bin/tester .

Der Nette-Tester-Läufer durchsucht das angegebene Verzeichnis und alle Unterverzeichnisse und sucht nach Tests, d. h. nach den Dateien *.phpt und *Test.php. Er findet auch unseren Test ArrayTest.php, da er der Maske entspricht.

Dann beginnt er mit dem Testen. Jeder Test wird als neuer PHP-Prozess ausgeführt, so dass er völlig isoliert von den anderen läuft. Er wird parallel in mehreren Threads ausgeführt, was ihn extrem schnell macht. Und er führt zuerst die Tests aus, die beim vorherigen Durchlauf fehlgeschlagen sind, so dass Sie sofort wissen, ob Sie den Fehler behoben haben.

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................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)

35 Tests wurden durchgeführt, einer ist fehlgeschlagen, einer wurde übersprungen.

Wir fahren im Kapitel Tests durchführen fort.

Überwachungsmodus

Refaktorieren Sie den Code? Oder entwickeln Sie gar nach der TDD-Methodik (Test Driven Development)? Dann wird Ihnen der Watch Mode gefallen. Der Tester überwacht den Quellcode und führt sich selbst aus, wenn er geändert wird.

Während der Entwicklung haben Sie ein Terminal in der Ecke des Monitors, auf dem die grüne Statusleiste aufleuchtet, und wenn sie plötzlich rot wird, wissen Sie, dass Sie gerade etwas Unerwünschtes getan haben. Es ist eigentlich ein tolles Spiel, bei dem man programmiert und versucht, sich an die Farbe zu halten.

Der Watch-Modus wird mit dem Parameter –watch gestartet.

CodeCoverage Berichte

Der Tester kann Berichte erstellen, die einen Überblick darüber geben, wie viel Quellcode die Tests abdecken. Der Bericht kann entweder im menschenlesbaren HTML-Format oder im Clover-XML-Format für die maschinelle Weiterverarbeitung erstellt werden.

Siehe den Beispiel-HTML-Bericht mit Code-Abdeckung.

Unterstützte PHP-Versionen

Version kompatibel mit PHP
Tester 2.5 PHP 8.0 – 8.3
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 neuesten Patch-Versionen.

Bis Version 1.7 unterstützte Tester HHVM 3.3.0 oder neuer (mit tester -p hhvm). Die Unterstützung wurde seit Tester 2.0 eingestellt. Die Verwendung war einfach: