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