17.PHPUnit

17.1.Introduction

Afin d'assurer la qualité du code que vous générez, vous devez obligatoirement le tester. Ce test doit bien évidemment se faire à "haut niveau", c'est à dire en reproduisant les opérations que l'opérateur sera amené à faire et en s'assurant que le résultat obtenu est bien celui attendu. Mais, la qualité passe avant tout par le test des différentes fonctions "bas niveau" implémentées. De plus à chaque modification de code, c'est l'ensemble du fonctionnement de l'application qui peut être affecté. En d'autres termes, à chaque modification de code, c'est l'ensemble des tests qui doivent être repassés. Dans cette optique il est nécessaire de mettre en place des tests (unitaires) automatiques. Pour cela, nous pouvons utiliser la bibliothèque PHPUnit de PEAR.

17.2.Installation

17.2.1.sous Linux/Debian

Sous debian, vous pouvez installer la dernière version de PHPUnit simplement avec la commande
aptitude update
aptitude install phpunit

17.2.2.méthode classique

Autrefois intégré à l'annuaire pear.php.net, PHPUnit est desormais disponible auprès de pear.phpunit.de. Ce n'est déjà fait, vous devez donc au préalable ajouter pear.phpunit.de dans la liste des annuaires de pear. Pour cela, tapez la commande suivante
pear channel-discover pear.phpunit.de
Cette opération effectuée une bonne fois pour toute, vous pouvez lancer l'installation proprement dite:
pear install phpunit/PHPUnit

17.3.Installation (vérification)

Vous devriez disposer d'une nouvelle commande. Tapez donc
phpunit --help
pour vous en assurer.

17.4.Utilisation

Vous vous souvenez, dans les premiers chapitres de ce site sur PHP, nous vous avons indiqué comment faire un include. A cette occasion, nous avons créé une bibliothèque de fonctions tout à fait ridicule, contenant la fonction cube, nous y avons ajouté la fonction puissance (qui existe déjà dans PHP sous le nom pow()) et nous allons la tester avec PHPUnit.
<?php
function cube($x) {
     return $x*$x*$x;
}

function puissance($x, $y) { 
    $resultat = 1;
    for ($i=0; $i<$y; $i++) $resultat *= $x;
    return $resultat;
}
?> 
Pour cela, nous devons créer une classe héritant de PHPUnit_Framework_TestCase où PHPUnit_Framework_TestCase est une classe offerte par PHPUnit dans le fichier Framework.php (que vous devriez posséder et avoir dans le chemin de recherche des fichiers inclus si l'installation s'est bien passée).
rem
  • Le nom de la classe doit nécessairement se terminer par Test
  • Le nom des méthodes de test doivent nécessairement commencer par test (mais peu importe ce qu'il y a derrière. Ce peut être un identifiant numérique ou un nom)
Lancez maintenant la commande
phpunit MathLibTest
Le résultat obtenu devrait être OK (1 test). Indiquant qu'un (et un seul) test a été déroulé (il s'agit ici du test01) et que celui-ci c'est déroulé avec succès.
Ce n'est évidemment pas dans ce cas de figure que c'est le plus impressionnant. Mais imaginez que la fonction implémentée (ici cube) soit bien plus complexe et qu'une erreur se soit glissée, elle aurait été immédiatement détectée (vous pouvez refaire le test en introduisant volontairement une erreur dans la fonction cube pour voir). Vous obtiendrez alors un message du genre 1) test01(MathLibTest) Failed asserting that <integer:XX> matches expected value <integer:27> indiquant que le test01 de MathLibTest a échoué parce que nous avons trouvé la valeur XX là où nous nous attendions à trouver 27.

17.5.Différents tests disponibles

Vous l'avez devenez dans le test précédent, assertEquals permet de vérifier si 2 valeurs sont égales et lever une erreur en cas de différence mais il y existe de nombreux autres tests possibles. En voici les principaux:
  • assertEquals($valeur, $valeurAttendu [, $message]) vérifie si les valeurs sont identiques (ex: assertEquals(0, 1) lévera une erreur)
  • assertFalse($condition [, $message]) vérifie si la condition est fausse (ex: assertFalse(0==0) lévera une erreur)
  • assertNotEquals($valeur, $valeurAttendu [, $message]) vérifie si les valeurs sont différentes (ex: assertNotEquals(1, 1) lévera une erreur)
  • assertNotNull($valeur [, $message]) vérifie si la valeur n'est pas null (ex: assertNotNull(null) lévera une erreur)
  • assertNull($valeur [, $message]) vérifie si la valeur est null (ex: assertNull("toto") lévera une erreur)
  • assertSame($valeur, $valeurAttendu [, $message]) vérifie si les paramètres sont de même type et même valeur (i.e. la même instance s'il s'agit d'objet) (ex: assertSame(0, false) et assertSame(new MaClasse(), new MaClasse()) léveront une erreur)
  • assertNotSame($valeur, $valeurAttendu [, $message]) inverse de assertSame()
  • assertTrue($condition [, $message]) vérifie si la condition est vraie (ex: assertTrue(1==0) lévera une erreur)