Helfer
DomQuery
Tester\DomQuery
ist eine Klasse, die SimpleXMLElement
mit Methoden erweitert, die das Testen von
HTML- oder XML-Inhalten erleichtern.
# $html ist ein String mit dem HTML-Dokument, $dom ist das Root-Element.
$dom = Tester\DomQuery::fromHtml($html);
# we can test the presence of elements using CSS selectors
Assert::true($dom->has('form#registration'));
Assert::true($dom->has('input[name="username"]'));
Assert::true($dom->has('input[type="submit"]'));
# or select elements as array of DomQuery
$elems = $dom->find('input[data-autocomplete]');
# oder überprüfen, ob das Element mit dem Selektor übereinstimmt (ab Version 2.5.3)
Assert::true($elems[0]->matches('[type="submit"]'));
FileMock
Tester\FileMock
emuliert Dateien im Speicher, um Ihnen zu helfen, einen Code zu testen, der Funktionen wie
fopen()
, file_get_contents()
oder parse_ini_file()
verwendet. Zum Beispiel:
# Tested class
class Logger
{
public function __construct(
private string $logFile,
) {
}
public function log(string $message): void
{
file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
}
}
# New empty file
$file = Tester\FileMock::create('');
$logger = new Logger($file);
$logger->log('Login');
$logger->log('Logout');
# Created content testing
Assert::same("Login\nLogout\n", file_get_contents($file));
Assert::with()
Dies ist keine Behauptung, sondern ein Hilfsmittel zum Testen privater Methoden und Eigenschaftsobjekte.
class Entity
{
private $enabled;
// ...
}
$ent = new Entity;
Assert::with($ent, function () {
Assert::true($this->enabled); // zugänglich privat $ent->enabled
});
Helpers::purge()
Die Methode purge()
erstellt das angegebene Verzeichnis und löscht, falls es bereits existiert, seinen gesamten
Inhalt. Sie ist praktisch für die Erstellung temporärer Verzeichnisse. Zum Beispiel in tests/bootstrap.php
:
@mkdir(__DIR__ . '/tmp'); # @ - directory may already exist
define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);
Environment::lock()
Tests laufen parallel. Manchmal ist es notwendig, dass sich die Testläufe nicht überschneiden. Typischerweise müssen
Datenbanktests den Datenbankinhalt vorbereiten und dürfen während der Laufzeit des Tests nicht gestört werden. In diesen
Fällen verwenden wir Tester\Environment::lock($name, $dir)
:
Tester\Environment::lock('database', __DIR__ . '/tmp');
Das erste Argument ist der Name einer Sperre. Das zweite Argument ist ein Pfad zum Verzeichnis, in dem die Sperre gespeichert wird. Der Test, der die Sperre erwirbt, wird zuerst ausgeführt. Die anderen Tests müssen warten, bis er abgeschlossen ist.
Environment::bypassFinals()
Klassen oder Methoden, die als final
gekennzeichnet sind, sind schwer zu testen. Der Aufruf von
Tester\Environment::bypassFinals()
in einem Testbeginn bewirkt, dass die Schlüsselwörter final
beim
Laden des Codes entfernt werden.
require __DIR__ . '/bootstrap.php';
Tester\Environment::bypassFinals();
class MyClass extends NormallyFinalClass # <-- NormallyFinalClass ist nicht mehr final
{
// ...
}
Environment::setup()
- verbessert die Lesbarkeit von Fehlerdumps (mit Farbgebung), ansonsten wird der Standard-PHP-Stacktrace ausgegeben
- ermöglicht die Überprüfung, ob Assertions im Test aufgerufen wurden, ansonsten werden auch Tests ohne (z.B. vergessene) Assertions bestanden
- startet automatisch den Code Coverage Collector, wenn
--coverage
verwendet wird (später beschrieben) - gibt am Ende des Skripts den Status OK oder FAILURE aus
Environment::setupFunctions()
Erzeugt die globalen Funktionen test()
, testException()
, setUp()
und
tearDown()
, in die Sie Tests aufteilen können.
test('Testbeschreibung', function () {
Assert::same(123, foo());
Assert::false(bar());
// ...
});
Environment::VariableRunner
Ermöglicht es Ihnen herauszufinden, ob der Test direkt oder über den Tester ausgeführt wurde.
if (getenv(Tester\Environment::VariableRunner)) {
# run by Tester
} else {
# another way
}
Environment::VariableThread
Tester führt Tests parallel in einer bestimmten Anzahl von Threads aus. Die Anzahl der Threads finden wir in einer Environmentsvariablen, wenn wir daran interessiert sind:
echo "I'm running in a thread number " . getenv(Tester\Environment::VariableThread);