Classes d'aide

DomQuery

Tester\DomQuery est une classe qui étend SimpleXMLElement et facilite la recherche dans du HTML ou XML à l'aide de sélecteurs CSS.

# création de DomQuery à partir d'une chaîne HTML
$dom = Tester\DomQuery::fromHtml('
	<article class="post">
		<h1>Titre</h1>
		<div class="content">Texte</div>
	</article>
');

# test d'existence d'éléments à l'aide de sélecteurs CSS
Assert::true($dom->has('article.post'));
Assert::true($dom->has('h1'));

# recherche d'éléments sous forme de tableau d'objets DomQuery
$headings = $dom->find('h1');
Assert::same('Titre', (string) $headings[0]);

# test si l'élément correspond au sélecteur (depuis la version 2.5.3)
$content = $dom->find('.content')[0];
Assert::true($content->matches('div'));
Assert::false($content->matches('p'));

# recherche de l'ancêtre le plus proche correspondant au sélecteur (depuis 2.5.5)
$article = $content->closest('.post');
Assert::true($article->matches('article'));

FileMock

Tester\FileMock émule des fichiers en mémoire, facilitant ainsi le test de code qui utilise des fonctions comme fopen(), file_get_contents(), parse_ini_file(), etc. Exemple d'utilisation :

# Classe testée
class Logger
{
	public function __construct(
		private string $logFile,
	) {
	}

	public function log(string $message): void
	{
		file_put_contents($this->logFile, $message . "\n", FILE_APPEND);
	}
}

# Nouveau fichier vide
$file = Tester\FileMock::create('');

$logger = new Logger($file);
$logger->log('Login');
$logger->log('Logout');

# Nous testons le contenu créé
Assert::same("Login\nLogout\n", file_get_contents($file));

Assert::with()

Ce n'est pas une assertion, mais un helper pour tester les méthodes et propriétés privées des objets.

class Entity
{
	private $enabled;
	// ...
}

$ent = new Entity;

Assert::with($ent, function () {
	Assert::true($this->enabled); // $ent->enabled privé rendu accessible
});

Helpers::purge()

La méthode purge() crée le répertoire spécifié et, s'il existe déjà, supprime tout son contenu. C'est utile pour créer un répertoire temporaire. Par exemple dans tests/bootstrap.php :

@mkdir(__DIR__ . '/tmp');  # @ - le répertoire peut déjà exister

define('TempDir', __DIR__ . '/tmp/' . getmypid());
Tester\Helpers::purge(TempDir);

Environment::lock()

Les tests s'exécutent en parallèle. Parfois, cependant, nous avons besoin que les exécutions de tests ne se chevauchent pas. Typiquement, pour les tests de base de données, il est nécessaire qu'un test prépare le contenu de la base de données et qu'aucun autre test n'y interfère pendant son exécution. Dans ces tests, nous utilisons Tester\Environment::lock($name, $dir) :

Tester\Environment::lock('database', __DIR__ . '/tmp');

Le premier argument est le nom du verrou, le second est le chemin vers le répertoire où stocker le verrou. Le test qui obtient le verrou en premier s'exécute ; les autres tests doivent attendre sa fin.

Environment::bypassFinals()

Les classes ou méthodes marquées comme final sont difficiles à tester. L'appel à Tester\Environment::bypassFinals() au début du test provoque l'omission des mots-clés final lors du chargement du code.

require __DIR__ . '/bootstrap.php';

Tester\Environment::bypassFinals();

class MyClass extends NormallyFinalClass  # <-- NormallyFinalClass n'est plus final
{
	// ...
}

Environment::setup()

  • améliore la lisibilité des rapports d'erreurs (y compris la coloration syntaxique), sinon la trace d'appels PHP par défaut est affichée
  • active la vérification que des assertions ont été appelées dans le test ; sinon, un test sans assertions (par exemple, oubliées) serait considéré comme réussi
  • lors de l'utilisation de --coverage, démarre automatiquement la collecte d'informations sur la couverture de code (décrite plus loin)
  • affiche le statut OK ou FAILURE à la fin du script

Environment::setupFunctions()

Crée les fonctions globales test(), testException(), setUp() et tearDown(), que vous pouvez utiliser pour structurer vos tests.

test('description du test', function () {
	Assert::same(123, foo());
	Assert::false(bar());
	// ...
});

Environment::VariableRunner

Permet de déterminer si le test a été lancé directement ou via Tester.

if (getenv(Tester\Environment::VariableRunner)) {
	# lancé par Tester
} else {
	# lancé autrement
}

Environment::VariableThread

Tester exécute les tests en parallèle sur un nombre de threads spécifié. Si le numéro du thread nous intéresse, nous pouvons le récupérer depuis la variable d'environnement :

echo "Je tourne dans le thread numéro " . getenv(Tester\Environment::VariableThread);