1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
<?xml version="1.0" encoding="ISO-8859-1" ?>
<page title="Documentation sur les tests unitaires en PHP" here="Documentation : les tests unitaires en PHP">
<long_title>Documentation SimpleTest pour les tests de rgression en PHP</long_title>
<content>
<section name="unitaire" title="Scnarios de tests unitaires">
<p>
Le coeur du systme est un framework de tests de rgression construit autour des scnarios de test. Un exemple de scnario de test ressemble ...
<php><![CDATA[
<strong>class FileTestCase extends UnitTestCase {
}</strong>
]]></php>
Si aucun nom de test n'est fourni au moment de la liaison avec le constructeur alors le nom de la classe sera utilis. Il s'agit du nom qui sera affich dans les rsultats du test.
</p>
<p>
Les vritables tests sont ajouts en tant que mthode dans le scnario de test dont le nom par dfaut commence par la chane "test" et quand le scnario de test est appel toutes les mthodes de ce type sont excutes dans l'ordre utilis par l'introspection de PHP pour les trouver. Peuvent tre ajoutes autant de mthodes de test que ncessaires. Par exemple...
<php><![CDATA[
require_once('../classes/writer.php');
class FileTestCase extends UnitTestCase {
function FileTestCase() {
$this->UnitTestCase('File test');
}<strong>
function setUp() {
@unlink('../temp/test.txt');
}
function tearDown() {
@unlink('../temp/test.txt');
}
function testCreation() {
$writer = &new FileWriter('../temp/test.txt');
$writer->write('Hello');
$this->assertTrue(file_exists('../temp/test.txt'), 'File created');
}</strong>
}
]]></php>
Le constructeur est optionnel et souvent omis. Sans nom, le nom de la classe est utilis comme nom pour le scnario de test.
</p>
<p>
Notre unique mthode de test pour le moment est <code>testCreation()</code> o nous vrifions qu'un fichier a bien t cr par notre objet <code>Writer</code>. Nous pourrions avoir mis le code <code>unlink()</code> dans cette mthode, mais en la plaant dans <code>setUp()</code> et <code>tearDown()</code> nous pouvons l'utiliser pour nos autres mthodes de test que nous ajouterons.
</p>
<p>
La mthode <code>setUp()</code> est lanc juste avant chaque mthode de test. <code>tearDown()</code> est lanc aprs chaque mthode de test.
</p>
<p>
Vous pouvez placer une initialisation de scnario de test dans le constructeur afin qu'elle soit lance pour toutes les mthodes dans le scnario de test mais dans un tel cas vous vous exposeriez des interfrences. Cette faon de faire est lgrement moins rapide, mais elle est plus sre. Notez que si vous arrivez avec des notions de JUnit, il ne s'agit pas du comportement auquel vous tes habitus. Bizarrement JUnit re-instancie le scnario de test pour chaque mthode de test pour se prvenir d'une telle interfrence. SimpleTest demande l'utilisateur final d'utiliser <code>setUp()</code>, mais fournit aux codeurs de bibliothque d'autres crochets.
</p>
<p>
Pour rapporter les rsultats de test, le passage par une classe d'affichage - notifie par les diffrentes mthodes de type <code>assert...()</code> - est utilise. En voici la liste complte pour la classe <code>UnitTestCase</code>, celle par dfaut dans SimpleTest...
<table><tbody>
<tr><td><code>assertTrue($x)</code></td><td>Echoue si $x est faux</td></tr>
<tr><td><code>assertFalse($x)</code></td><td>Echoue si $x est vrai</td></tr>
<tr><td><code>assertNull($x)</code></td><td>Echoue si $x est initialis</td></tr>
<tr><td><code>assertNotNull($x)</code></td><td>Echoue si $x n'est pas initialis</td></tr>
<tr><td><code>assertIsA($x, $t)</code></td><td>Echoue si $x n'est pas de la classe ou du type $t</td></tr>
<tr><td><code>assertEqual($x, $y)</code></td><td>Echoue si $x == $y est faux</td></tr>
<tr><td><code>assertNotEqual($x, $y)</code></td><td>Echoue si $x == $y est vrai</td></tr>
<tr><td><code>assertIdentical($x, $y)</code></td><td>Echoue si $x === $y est faux</td></tr>
<tr><td><code>assertNotIdentical($x, $y)</code></td><td>Echoue si $x === $y est vrai</td></tr>
<tr><td><code>assertReference($x, $y)</code></td><td>Echoue sauf si $x et $y sont la mme variable</td></tr>
<tr><td><code>assertCopy($x, $y)</code></td><td>Echoue si $x et $y sont la mme variable</td></tr>
<tr><td><code>assertWantedPattern($p, $x)</code></td><td>Echoue sauf si l'expression rationnelle $p capture $x</td></tr>
<tr><td><code>assertNoUnwantedPattern($p, $x)</code></td><td>Echoue si l'expression rationnelle $p capture $x</td></tr>
<tr><td><code>assertNoErrors()</code></td><td>Echoue si une erreur PHP arrive</td></tr>
<tr><td><code>assertError($x)</code></td><td>Echoue si aucune erreur ou message incorrect de PHP n'arrive</td></tr>
</tbody></table>
Toutes les mthodes d'assertion peuvent recevoir une description optionnelle : cette description sert pour tiqueter le rsultat.
Sans elle, une message par dfaut est envoye la place : il est gnralement suffisant. Ce message par dfaut peut encore tre encadr dans votre propre message si vous incluez "%s" dans la chane. Toutes les assertions renvoient vrai / true en cas de succs et faux / false en cas d'chec.
</p>
<p>
D'autres exemples...
<php><![CDATA[
<strong>$variable = null;
$this->assertNull($variable, 'Should be cleared');</strong>
]]></php>
...passera et normalement n'affichera aucun message. Si vous avez <a href="http://www.lastcraft.com/display_subclass_tutorial.php">configur le testeur pour afficher aussi les succs</a> alors le message sera affich comme tel.
<php><![CDATA[
<strong>$this->assertIdentical(0, false, 'Zero is not false [%s]');</strong>
]]></php>
Ceci chouera tant donn qu'il effectue une vrification sur le type en plus d'une comparaison sur les deux valeurs. La partie "%s" est remplace par le message d'erreur par dfaut qui aurait t affich si nous n'avions pas fourni le ntre. Cela nous permet d'emboter les messages de test.
<php><![CDATA[
<strong>$a = 1;
$b = $a;
$this->assertReference($a, $b);</strong>
]]></php>
chouera tant donn que la variable <code>$b</code> est une copie de <code>$a</code>.
<php><![CDATA[
<strong>$this->assertWantedPattern('/hello/i', 'Hello world');</strong>
]]></php>
L, a passe puisque la recherche est insensible la casse et que donc <code>hello</code> est bien reprable dans <code>Hello world</code>.
<php><![CDATA[
<strong>trigger_error('Disaster');
trigger_error('Catastrophe');
$this->assertError();
$this->assertError('Catastrophe');
$this->assertNoErrors();</strong>
]]></php>
Ici, il y a besoin d'une petite explication : toutes passent !
</p>
<p>
Les erreurs PHP dans SimpleTest sont piges et places dans une queue. Ici la premire vrification d'erreur attrape le message "Disaster" sans vrifier le texte et passe. Rsultat : l'erreur est supprime de la queue. La vrification suivante teste non seulement l'existence de l'erreur mais aussi le texte qui correspond : un autre succs. Dsormais la queue est vide et le dernier test passe aussi. Si une autre erreur non vrifie est encore dans la queue la fin de notre mthode de test alors une exception sera rapporte dans le test. Notez que SimpleTest ne peut pas attraper les erreurs PHP la compilation.
</p>
<p>
Les scnarios de test peuvent utiliser des mthodes bien pratiques pour dboguer le code ou pour tendre la suite...
<table><tbody>
<tr><td><code>setUp()</code></td><td>Est lance avant chaque mthode de test</td></tr>
<tr><td><code>tearDown()</code></td><td>Est lance aprs chaque mthode de test</td></tr>
<tr><td><code>pass()</code></td><td>Envoie un succs</td></tr>
<tr><td><code>fail()</code></td><td>Envoie un chec</td></tr>
<tr><td><code>error()</code></td><td>Envoi un vnement exception</td></tr>
<tr><td><code>sendMessage()</code></td><td>Envoie un message d'tat aux systmes d'affichage qui le supporte</td></tr>
<tr><td><code>signal($type, $payload)</code></td><td>Envoie un message dfini par l'utilisateur au rapporteur du test</td></tr>
<tr><td><code>dump($var)</code></td><td>Effectue un <code>print_r()</code> format pour du dboguage rapide et grossier</td></tr>
<tr><td><code>swallowErrors()</code></td><td>Vide les erreurs de la queue</td></tr>
</tbody></table>
</p>
</section>
<section name="extension_unitaire" title="Etendre les scnarios de test">
<p>
Bien sr des mthodes supplmentaires de test peuvent tre ajoutes pour crer d'autres types de scnario de test afin d'tendre le framework...
<php><![CDATA[
require_once('simpletest/unit_tester.php');
<strong>
class FileTester extends UnitTestCase {
function FileTester($name = false) {
$this->UnitTestCase($name);
}
function assertFileExists($filename, $message = '%s') {
$this->assertTrue(
file_exists($filename),
sprintf($message, 'File [$filename] existence check'));
}</strong>
}
]]></php>
Ici la bibliothque SimpleTest est localise dans un rpertoire local appel <em>simpletest</em>. Pensez le modifier pour votre propre environnement.
</p>
<p>
Ce nouveau scnario peut tre hrit exactement comme un scnario de test classique...
<php><![CDATA[
class FileTestCase extends <strong>FileTester</strong> {
function setUp() {
@unlink('../temp/test.txt');
}
function tearDown() {
@unlink('../temp/test.txt');
}
function testCreation() {
$writer = &new FileWriter('../temp/test.txt');
$writer->write('Hello');<strong>
$this->assertFileExists('../temp/test.txt');</strong>
}
}
]]></php>
</p>
<p>
Si vous souhaitez un scnario de test sans toutes les assertions de <code>UnitTestCase</code> mais uniquement avec les vtres propres, vous aurez besoin d'tendre la classe <code>SimpleTestCase</code> la place. Elle se trouve dans <em>simple_test.php</em> en lieu et place de <em>unit_tester.php</em>. A consulter <a local="group_test_documentation">plus tard</a> si vous souhaitez incorporer les scnarios d'autres testeurs unitaires dans votre suite de test.
</p>
</section>
<section name="lancement_unitaire" title="Lancer un unique scnario de test">
<p>
Ce n'est pas souvent qu'il faille lancer des scnarios avec un unique test. Sauf lorsqu'il s'agit de s'arracher les cheveux sur un module problme sans pour autant dsorganiser la suite de test principale. Voici l'chafaudage ncessaire pour lancer un scnario de test solitaire...
<php><![CDATA[
<?php
require_once('simpletest/unit_tester.php');<strong>
require_once('simpletest/reporter.php');</strong>
require_once('../classes/writer.php');
class FileTestCase extends UnitTestCase {
function FileTestCase() {
$this->UnitTestCase('File test');
}
}<strong>
$test = &new FileTestCase();
$test->run(new HtmlReporter());</strong>
?>
]]></php>
Ce script sera lanc tel que mais il n'y aura aucun succs ou chec avant que des mthodes de test soient ajoutes.
</p>
</section>
</content>
<internal>
<link>
<a href="#unitaire">Scnarios de test unitaire</a> et oprations basiques.
</link>
<link>
<a href="#extension_unitaire">tendre des scnarios de test</a> pour les personnaliser votre propre projet.
</link>
<link>
<a href="#lancement_unitaire">Lancer un scnario seul</a> comme un script unique.
</link>
</internal>
<external>
<link>
La page de SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
</link>
<link>
La page de tlchargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
</link>
<link>
<a href="http://simpletest.sourceforge.net/">L'API complte de SimpleTest</a> partir de PHPDoc.
</link>
</external>
<meta>
<keywords>
test unitaire php,
test d'intgration,
documentation,
marcus baker,
perrick penet
simple test,
documentation simpletest,
phpunit,
junit,
xunit
</keywords>
</meta>
</page>
|