Le coeur du système est un framework de tests de régression construit autour des scénarios de test. Un exemple de scénario de test ressemble à...
Les véritables tests sont ajoutés en tant que méthode dans le scénario de test dont le nom par défaut commence par la chaîne "test" et quand le scénario de test est appelé toutes les méthodes de ce type sont exécutées dans l'ordre utilisé par l'introspection de PHP pour les trouver. Peuvent être ajoutées autant de méthodes de test que nécessaires. Par exemple...
Notre unique méthode de test pour le moment est testCreation() où nous vérifions qu'un fichier a bien été créé par notre objet Writer. Nous pourrions avoir mis le code unlink() dans cette méthode, mais en la plaçant dans setUp() et tearDown() nous pouvons l'utiliser pour nos autres méthodes de test que nous ajouterons.
La méthode setUp() est lancé juste avant chaque méthode de test. tearDown() est lancé après chaque méthode de test.
Vous pouvez placer une initialisation de scénario de test dans le constructeur afin qu'elle soit lancée pour toutes les méthodes dans le scénario de test mais dans un tel cas vous vous exposeriez à des interférences. Cette façon de faire est légèrement moins rapide, mais elle est plus sûre. Notez que si vous arrivez avec des notions de JUnit, il ne s'agit pas du comportement auquel vous êtes habitués. Bizarrement JUnit re-instancie le scénario de test pour chaque méthode de test pour se prévenir d'une telle interférence. SimpleTest demande à l'utilisateur final d'utiliser setUp(), mais fournit aux codeurs de bibliothèque d'autres crochets.
Pour rapporter les résultats de test, le passage par une classe d'affichage - notifiée par les différentes méthodes de type assert...() - est utilisée. En voici la liste complète pour la classe UnitTestCase, celle par défaut dans SimpleTest...
assertTrue($x) | Echoue si $x est faux |
assertFalse($x) | Echoue si $x est vrai |
assertNull($x) | Echoue si $x est initialisé |
assertNotNull($x) | Echoue si $x n'est pas initialisé |
assertIsA($x, $t) | Echoue si $x n'est pas de la classe ou du type $t |
assertEqual($x, $y) | Echoue si $x == $y est faux |
assertNotEqual($x, $y) | Echoue si $x == $y est vrai |
assertIdentical($x, $y) | Echoue si $x === $y est faux |
assertNotIdentical($x, $y) | Echoue si $x === $y est vrai |
assertReference($x, $y) | Echoue sauf si $x et $y sont la même variable |
assertCopy($x, $y) | Echoue si $x et $y sont la même variable |
assertWantedPattern($p, $x) | Echoue sauf si l'expression rationnelle $p capture $x |
assertNoUnwantedPattern($p, $x) | Echoue si l'expression rationnelle $p capture $x |
assertNoErrors() | Echoue si une erreur PHP arrive |
assertError($x) | Echoue si aucune erreur ou message incorrect de PHP n'arrive |
D'autres exemples...
$b est une copie de $a.
hello est bien repérable dans Hello world.
Les erreurs PHP dans SimpleTest sont piégées et placées dans une queue. Ici la première vérification d'erreur attrape le message "Disaster" sans vérifier le texte et passe. Résultat : l'erreur est supprimée de la queue. La vérification suivante teste non seulement l'existence de l'erreur mais aussi le texte qui correspond : un autre succès. Désormais la queue est vide et le dernier test passe aussi. Si une autre erreur non vérifiée est encore dans la queue à la fin de notre méthode de test alors une exception sera rapportée dans le test. Notez que SimpleTest ne peut pas attraper les erreurs PHP à la compilation.
Les scénarios de test peuvent utiliser des méthodes bien pratiques pour déboguer le code ou pour étendre la suite...
setUp() | Est lancée avant chaque méthode de test |
tearDown() | Est lancée après chaque méthode de test |
pass() | Envoie un succès |
fail() | Envoie un échec |
error() | Envoi un évènement exception |
sendMessage() | Envoie un message d'état aux systèmes d'affichage qui le supporte |
signal($type, $payload) | Envoie un message défini par l'utilisateur au rapporteur du test |
dump($var) | Effectue un print_r() formaté pour du déboguage rapide et grossier |
swallowErrors() | Vide les erreurs de la queue |
Bien sûr des méthodes supplémentaires de test peuvent être ajoutées pour créer d'autres types de scénario de test afin d'étendre le framework...
Ce nouveau scénario peut être hérité exactement comme un scénario de test classique...
Si vous souhaitez un scénario de test sans toutes les assertions de UnitTestCase mais uniquement avec les vôtres propres, vous aurez besoin d'étendre la classe SimpleTestCase à la place. Elle se trouve dans simple_test.php en lieu et place de unit_tester.php. A consulter plus tard si vous souhaitez incorporer les scénarios d'autres testeurs unitaires dans votre suite de test.
Ce n'est pas souvent qu'il faille lancer des scénarios avec un unique test. Sauf lorsqu'il s'agit de s'arracher les cheveux sur un module à problème sans pour autant désorganiser la suite de test principale. Voici l'échafaudage nécessaire pour lancer un scénario de test solitaire...