Hilfsklassen
DomQuery
Tester\DomQuery
ist eine Klasse, die SimpleXMLElement
um die einfache Suche in HTML oder XML mittels
CSS-Selektoren erweitert.
# Erstellung von DomQuery aus einer HTML-Zeichenkette
$dom = Tester\DomQuery::fromHtml('
<article class="post">
<h1>Titel</h1>
<div class="content">Text</div>
</article>
');
# Test der Existenz von Elementen mittels CSS-Selektoren
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));
# Finden von Elementen als Array von DomQuery-Objekten
$headings = $dom->find('h1');
Assert::same('Titel', (string) $headings[0]);
# Test, ob ein Element einem Selektor entspricht (ab Version 2.5.3)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));
# Finden des nächsten Vorfahren, der dem Selektor entspricht (ab 2.5.5)
$article = $content->closest('.post');
Assert::true($article->matches('article'));
FileMock
Tester\FileMock
emuliert Dateien im Speicher und erleichtert so das Testen von Code, der Funktionen wie
fopen()
, file_get_contents()
, parse_ini_file()
und ähnliche verwendet.
Anwendungsbeispiel:
# Getestete Klasse
class Logger
{
public function __construct(
private string $logFile,
) {
}
public function log(string $message): void
{
file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
}
}
# Neue leere Datei
$file = Tester\FileMock::create('');
$logger = new Logger($file);
$logger->log('Login');
$logger->log('Logout');
# Testen des erstellten Inhalts
Assert::same("Login\nLogout\n", file_get_contents($file));
Assert::with()
Dies ist keine Assertion, sondern ein Helfer zum Testen privater Methoden und Eigenschaften von Objekten.
class Entity
{
private $enabled;
// ...
}
$ent = new Entity;
Assert::with($ent, function () {
Assert::true($this->enabled); // zugänglich gemachte private $ent->enabled
});
Helpers::purge()
Die Methode purge()
erstellt das angegebene Verzeichnis und löscht, falls es bereits existiert, seinen gesamten
Inhalt. Sie eignet sich zur Erstellung eines temporären Verzeichnisses. Zum Beispiel in tests/bootstrap.php
:
@mkdir(__DIR__ . '/tmp'); # @ - Verzeichnis kann bereits existieren
define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);
Environment::lock()
Tests werden parallel ausgeführt. Manchmal benötigen wir jedoch, dass sich die Ausführung von Tests nicht überschneidet.
Typischerweise ist es bei Datenbanktests notwendig, dass ein Test den Inhalt der Datenbank vorbereitet und ein anderer Test
während seiner Laufzeit nicht auf die Datenbank zugreift. In diesen Tests verwenden wir
Tester\Environment::lock($name, $dir)
:
Tester\Environment::lock('database', __DIR__ . '/tmp');
Der erste Parameter ist der Name der Sperre, der zweite der Pfad zum Verzeichnis zum Speichern der Sperrdatei. Der Test, der die Sperre zuerst erhält, wird ausgeführt, andere Tests müssen auf dessen Abschluss warten.
Environment::bypassFinals()
Klassen oder Methoden, die als final
markiert sind, sind schwer zu testen. Der Aufruf von
Tester\Environment::bypassFinals()
zu Beginn des Tests bewirkt, dass die Schlüsselwörter final
während des Ladens 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 der Fehlerausgabe (einschließlich Farbgebung), andernfalls wird der standardmäßige PHP-Stack-Trace ausgegeben
- aktiviert die Überprüfung, ob im Test Assertions aufgerufen wurden, andernfalls würde ein Test ohne Assertions (z. B. vergessene) ebenfalls bestehen
- bei Verwendung von
--coverage
startet automatisch die Sammlung von Informationen über den ausgeführten Code (weiter unten beschrieben) - gibt am Ende des Skripts den Status OK oder FAILURE aus
Environment::setupFunctions()
Erstellt globale Funktionen test()
, testException()
, setUp()
und
tearDown()
, in die Sie Tests gliedern können.
test('Beschreibung des Tests', function () {
Assert::same(123, foo());
Assert::false(bar());
// ...
});
Environment::VariableRunner
Ermöglicht die Feststellung, ob der Test direkt oder über Tester gestartet wurde.
if (getenv(Tester\Environment::VariableRunner)) {
# von Tester gestartet
} else {
# anders gestartet
}
Environment::VariableThread
Tester führt Tests parallel in der angegebenen Anzahl von Threads aus. Wenn uns die Thread-Nummer interessiert, erfahren wir sie aus der Umgebungsvariable:
echo "Ich laufe in Thread Nummer " . getenv(Tester\Environment::VariableThread);
`
php