Système de Data Provider
Objectifs
Comprendre et maîtriser le système de Data Provider proposé par PHPUnit
Contexte :
Nous avons vu dans la partie précédente de ce chapitre qu'il peut être essentiel de réaliser un test unitaire avec des données différentes pour s'assurer du bon fonctionnement de notre unité, peu importe ses entrées.
Le système de Data Provider fourni par PHPUnit répond justement à cette nécessité sans que l'on ait à appeler plusieurs fois la méthode assertEquals()
.
Méthode :
Une fois n'est pas coutume, nous souhaitons tester notre méthode hello()
issue de la classe HelloWorld
. Cette fois, bien entendu, nous souhaitons la tester avec plusieurs données différentes. Pour cela, il nous faut d'abord définir une méthode fournisseuse de données.
Cette méthode doit retourner un tableau de tableaux PHP contenant le ou les arguments à passer à la méthode testée, suivi du résultat attendu. Dans notre cas, voici à quoi ressemble notre méthode fournisseuse de données helloProvider()
:
public function helloProvider()
{
return [
["Chris", "Hello Chris"],
["Valentin", "Hello Valentin"],
["Juliette", "Hello Juliette"],
["Mehdi", "Hello Mehdi"]
];
}
Ici, la méthode testée hello()
n'attend qu'un argument correspondant à une chaîne de caractères représentant un prénom. C'est cette valeur que l'on retrouve en première position de chacun de nos tableaux PHP. Le second élément correspond au résultat censé être retourné.
Notez qu'il s'agit là uniquement de la méthode fournisseuse de données et en aucun cas de la méthode de test. Penchons-nous justement sur cette dernière.
Afin qu'elle se base sur les données définies à travers la méthode fournisseuse de données, il faudra configurer l'annotation @dataProvider
suivi du nom de la méthode en question.
Notez que les paramètres d'entrée de cette méthode correspondent aux valeurs renseignées dans les tableaux PHP de la méthode fournisseuse de données. Ainsi, le premier paramètre de la méthode correspondra à un prénom et le second au résultat attendu.
Pour ce qui est du corps de la méthode de test, nous instancierons la classe à tester avant d'appeler la méthode asertSame()
issue, encore une fois, de la classe TestCase
.
Cette dernière prend 2 arguments :
Le résultat attendu et passé en paramètre de la méthode de test,
L'appel à la méthode à tester avec le ou les arguments qu'elle doit recevoir.
/**
* @dataProvider helloProvider
*/
public function testHello($name, $expected) {
$helloWorld = new HelloWorld();
$this->assertSame($expected, $helloWorld->hello($name));
}
Voici la classe HelloWorldTest
complète et mise à jour avec le système de Data Provider :
<?php
# tests/Util/HelloWorldTest.php
namespace Tests\Util;
use App\Util\HelloWorld;
use PHPUnit\Framework\TestCase;
class HelloWorldTest extends TestCase {
/**
* @dataProvider helloProvider
*/
public function testHello($name, $expected) {
$helloWorld = new HelloWorld();
$this->assertSame($expected, $helloWorld->hello($name));
}
public function helloProvider()
{
return [
["Chris", "Hello Chris"],
["Valentin", "Hello Valentin"],
["Juliette", "Hello Juliette"],
["Mehdi", "Hello Mehdi"]
];
}
}
Syntaxe : À retenir
Concernant le système de Data Provider, on retiendra l'annotation @dataProvider
à faire suivre par le nom de la méthode fournisseuse de données. Cette annotation doit apparaître au-dessus de la méthode de test afin qu'elle reçoive des paramètres correspondants aux valeurs renseignées dans le tableau de tableaux PHP, renvoyé par la méthode fournisseuse de données. Ces tableaux comportent ainsi les valeurs d'entrée de la méthode testée ainsi que le résultat renvoyé par cette dernière.
La méthode assertEquals()
issue de la classe PHPUnit TestCase
nous permet de comparer les valeurs attendues aux résultats réellement renvoyés par la méthode testée.