Helfer

DomQuery

Tester\DomQuery ist eine Klasse, die SimpleXMLElement mit Methoden erweitert, die das Testen von HTML- oder XML-Inhalten erleichtern.

# let's have an HTML document in $html that we load
$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]');

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