~budgester/irm/trunk

« back to all changes in this revision

Viewing changes to testing/simpletest/docs/fr/unit_test_documentation.html

  • Committer: budgester at budgester
  • Date: 2008-03-05 23:14:13 UTC
  • Revision ID: budgester@budgester.com-20080305231413-k5vqfuckfo09ju42
Initial import of IRM codebase

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<html>
 
2
<head>
 
3
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
4
<title>Documentation SimpleTest pour les tests de r&eacute;gression en PHP</title>
 
5
<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
 
6
</head>
 
7
<body>
 
8
<div class="menu_back">
 
9
<div class="menu">
 
10
<h2>
 
11
<a href="index.html">SimpleTest</a>
 
12
</h2>
 
13
<ul>
 
14
<li>
 
15
<a href="overview.html">Overview</a>
 
16
</li>
 
17
<li>
 
18
<a href="unit_test_documentation.html">Unit tester</a>
 
19
</li>
 
20
<li>
 
21
<a href="group_test_documentation.html">Group tests</a>
 
22
</li>
 
23
<li>
 
24
<a href="mock_objects_documentation.html">Mock objects</a>
 
25
</li>
 
26
<li>
 
27
<a href="partial_mocks_documentation.html">Partial mocks</a>
 
28
</li>
 
29
<li>
 
30
<a href="reporter_documentation.html">Reporting</a>
 
31
</li>
 
32
<li>
 
33
<a href="expectation_documentation.html">Expectations</a>
 
34
</li>
 
35
<li>
 
36
<a href="web_tester_documentation.html">Web tester</a>
 
37
</li>
 
38
<li>
 
39
<a href="form_testing_documentation.html">Testing forms</a>
 
40
</li>
 
41
<li>
 
42
<a href="authentication_documentation.html">Authentication</a>
 
43
</li>
 
44
<li>
 
45
<a href="browser_documentation.html">Scriptable browser</a>
 
46
</li>
 
47
</ul>
 
48
</div>
 
49
</div>
 
50
<h1>Documentation sur les tests unitaires en PHP</h1>
 
51
<div class="content">
 
52
        <p>
 
53
<a class="target" name="unitaire">
 
54
<h2>Sc&eacute;narios de tests unitaires</h2>
 
55
</a>
 
56
</p>
 
57
            <p>
 
58
                Le coeur du syst&egrave;me est un framework de tests de r&eacute;gression construit autour des sc&eacute;narios de test. Un exemple de sc&eacute;nario de test ressemble &agrave;...
 
59
<pre>
 
60
<strong>class FileTestCase extends UnitTestCase {
 
61
}</strong>
 
62
</pre>
 
63
                Si aucun nom de test n'est fourni au moment de la liaison avec le constructeur alors le nom de la classe sera utilis&eacute;. Il s'agit du nom qui sera affich&eacute; dans les r&eacute;sultats du test.
 
64
            </p>
 
65
            <p>
 
66
                Les v&eacute;ritables tests sont ajout&eacute;s en tant que m&eacute;thode dans le sc&eacute;nario de test dont le nom par d&eacute;faut commence par la cha&icirc;ne "test" et quand le sc&eacute;nario de test est appel&eacute; toutes les m&eacute;thodes de ce type sont ex&eacute;cut&eacute;es dans l'ordre utilis&eacute; par l'introspection de PHP pour les trouver. Peuvent &ecirc;tre ajout&eacute;es autant de m&eacute;thodes de test que n&eacute;cessaires. Par exemple...
 
67
<pre>
 
68
require_once('../classes/writer.php');
 
69
 
 
70
class FileTestCase extends UnitTestCase {
 
71
    function FileTestCase() {
 
72
        $this-&gt;UnitTestCase('File test');
 
73
    }<strong>
 
74
    
 
75
    function setUp() {
 
76
        @unlink('../temp/test.txt');
 
77
    }
 
78
    
 
79
    function tearDown() {
 
80
        @unlink('../temp/test.txt');
 
81
    }
 
82
    
 
83
    function testCreation() {
 
84
        $writer = &amp;new FileWriter('../temp/test.txt');
 
85
        $writer-&gt;write('Hello');
 
86
        $this-&gt;assertTrue(file_exists('../temp/test.txt'), 'File created');
 
87
    }</strong>
 
88
}
 
89
</pre>
 
90
                Le constructeur est optionnel et souvent omis. Sans nom, le nom de la classe est utilis&eacute; comme nom pour le sc&eacute;nario de test.
 
91
            </p>
 
92
            <p>
 
93
                Notre unique m&eacute;thode de test pour le moment est <span class="new_code">testCreation()</span> o&ugrave; nous v&eacute;rifions qu'un fichier a bien &eacute;t&eacute; cr&eacute;&eacute; par notre objet <span class="new_code">Writer</span>. Nous pourrions avoir mis le code <span class="new_code">unlink()</span> dans cette m&eacute;thode, mais en la pla&ccedil;ant dans <span class="new_code">setUp()</span> et <span class="new_code">tearDown()</span> nous pouvons l'utiliser pour nos autres m&eacute;thodes de test que nous ajouterons.
 
94
            </p>
 
95
            <p>
 
96
                La m&eacute;thode <span class="new_code">setUp()</span> est lanc&eacute; juste avant chaque m&eacute;thode de test. <span class="new_code">tearDown()</span> est lanc&eacute; apr&egrave;s chaque m&eacute;thode de test.
 
97
            </p>
 
98
            <p>
 
99
                Vous pouvez placer une initialisation de sc&eacute;nario de test dans le constructeur afin qu'elle soit lanc&eacute;e pour toutes les m&eacute;thodes dans le sc&eacute;nario de test mais dans un tel cas vous vous exposeriez &agrave; des interf&eacute;rences. Cette fa&ccedil;on de faire est l&eacute;g&egrave;rement moins rapide, mais elle est plus s&ucirc;re. Notez que si vous arrivez avec des notions de JUnit, il ne s'agit pas du comportement auquel vous &ecirc;tes habitu&eacute;s. Bizarrement JUnit re-instancie le sc&eacute;nario de test pour chaque m&eacute;thode de test pour se pr&eacute;venir d'une telle interf&eacute;rence. SimpleTest demande &agrave; l'utilisateur final d'utiliser <span class="new_code">setUp()</span>, mais fournit aux codeurs de biblioth&egrave;que d'autres crochets.
 
100
            </p>
 
101
            <p>
 
102
                Pour rapporter les r&eacute;sultats de test, le passage par une classe d'affichage - notifi&eacute;e par les diff&eacute;rentes m&eacute;thodes de type <span class="new_code">assert...()</span> - est utilis&eacute;e. En voici la liste compl&egrave;te pour la classe <span class="new_code">UnitTestCase</span>, celle par d&eacute;faut dans SimpleTest...
 
103
            <table>
 
104
<tbody>
 
105
                <tr>
 
106
<td><span class="new_code">assertTrue($x)</span></td><td>Echoue si $x est faux</td>
 
107
</tr>
 
108
                <tr>
 
109
<td><span class="new_code">assertFalse($x)</span></td><td>Echoue si $x est vrai</td>
 
110
</tr>
 
111
                <tr>
 
112
<td><span class="new_code">assertNull($x)</span></td><td>Echoue si $x est initialis&eacute;</td>
 
113
</tr>
 
114
                <tr>
 
115
<td><span class="new_code">assertNotNull($x)</span></td><td>Echoue si $x n'est pas initialis&eacute;</td>
 
116
</tr>
 
117
                <tr>
 
118
<td><span class="new_code">assertIsA($x, $t)</span></td><td>Echoue si $x n'est pas de la classe ou du type $t</td>
 
119
</tr>
 
120
                <tr>
 
121
<td><span class="new_code">assertEqual($x, $y)</span></td><td>Echoue si $x == $y est faux</td>
 
122
</tr>
 
123
                <tr>
 
124
<td><span class="new_code">assertNotEqual($x, $y)</span></td><td>Echoue si $x == $y est vrai</td>
 
125
</tr>
 
126
                <tr>
 
127
<td><span class="new_code">assertIdentical($x, $y)</span></td><td>Echoue si $x === $y est faux</td>
 
128
</tr>
 
129
                <tr>
 
130
<td><span class="new_code">assertNotIdentical($x, $y)</span></td><td>Echoue si $x === $y est vrai</td>
 
131
</tr>
 
132
                <tr>
 
133
<td><span class="new_code">assertReference($x, $y)</span></td><td>Echoue sauf si $x et $y sont la m&ecirc;me variable</td>
 
134
</tr>
 
135
                <tr>
 
136
<td><span class="new_code">assertCopy($x, $y)</span></td><td>Echoue si $x et $y sont la m&ecirc;me variable</td>
 
137
</tr>
 
138
                <tr>
 
139
<td><span class="new_code">assertWantedPattern($p, $x)</span></td><td>Echoue sauf si l'expression rationnelle $p capture $x</td>
 
140
</tr>
 
141
                <tr>
 
142
<td><span class="new_code">assertNoUnwantedPattern($p, $x)</span></td><td>Echoue si l'expression rationnelle $p capture $x</td>
 
143
</tr>
 
144
                <tr>
 
145
<td><span class="new_code">assertNoErrors()</span></td><td>Echoue si une erreur PHP arrive</td>
 
146
</tr>
 
147
                <tr>
 
148
<td><span class="new_code">assertError($x)</span></td><td>Echoue si aucune erreur ou message incorrect de PHP n'arrive</td>
 
149
</tr>
 
150
            </tbody>
 
151
</table>
 
152
                Toutes les m&eacute;thodes d'assertion peuvent recevoir une description optionnelle : cette description sert pour &eacute;tiqueter le r&eacute;sultat.
 
153
                Sans elle, une message par d&eacute;faut est envoy&eacute;e &agrave; la place : il est g&eacute;n&eacute;ralement suffisant. Ce message par d&eacute;faut peut encore &ecirc;tre encadr&eacute; dans votre propre message si vous incluez "%s" dans la cha&icirc;ne. Toutes les assertions renvoient vrai / true en cas de succ&egrave;s et faux / false en cas d'&eacute;chec.
 
154
            </p>
 
155
            <p>
 
156
                D'autres exemples...
 
157
<pre>
 
158
<strong>$variable = null;
 
159
$this-&gt;assertNull($variable, 'Should be cleared');</strong>
 
160
</pre>
 
161
                ...passera et normalement n'affichera aucun message. Si vous avez <a href="http://www.lastcraft.com/display_subclass_tutorial.php">configur&eacute; le testeur pour afficher aussi les succ&egrave;s</a> alors le message sera affich&eacute; comme tel.
 
162
<pre>
 
163
<strong>$this-&gt;assertIdentical(0, false, 'Zero is not false [%s]');</strong>
 
164
</pre>
 
165
                Ceci &eacute;chouera &eacute;tant donn&eacute; qu'il effectue une v&eacute;rification sur le type en plus d'une comparaison sur les deux valeurs. La partie "%s" est remplac&eacute;e par le message d'erreur par d&eacute;faut qui aurait &eacute;t&eacute; affich&eacute; si nous n'avions pas fourni le n&ocirc;tre. Cela nous permet d'embo&icirc;ter les messages de test.
 
166
<pre>
 
167
<strong>$a = 1;
 
168
$b = $a;
 
169
$this-&gt;assertReference($a, $b);</strong>
 
170
</pre>
 
171
                &Eacute;chouera &eacute;tant donn&eacute; que la variable <span class="new_code">$b</span> est une copie de <span class="new_code">$a</span>.
 
172
<pre>
 
173
<strong>$this-&gt;assertWantedPattern('/hello/i', 'Hello world');</strong>
 
174
</pre>
 
175
                L&agrave;, &ccedil;a passe puisque la recherche est insensible &agrave; la casse et que donc <span class="new_code">hello</span> est bien rep&eacute;rable dans <span class="new_code">Hello world</span>.
 
176
<pre>
 
177
<strong>trigger_error('Disaster');
 
178
trigger_error('Catastrophe');
 
179
$this-&gt;assertError();
 
180
$this-&gt;assertError('Catastrophe');
 
181
$this-&gt;assertNoErrors();</strong>
 
182
</pre>
 
183
                Ici, il y a besoin d'une petite explication : toutes passent !
 
184
            </p>
 
185
            <p>
 
186
                Les erreurs PHP dans SimpleTest sont pi&eacute;g&eacute;es et plac&eacute;es dans une queue. Ici la premi&egrave;re v&eacute;rification d'erreur attrape le message "Disaster" sans v&eacute;rifier le texte et passe. R&eacute;sultat : l'erreur est supprim&eacute;e de la queue. La v&eacute;rification suivante teste non seulement l'existence de l'erreur mais aussi le texte qui correspond : un autre succ&egrave;s. D&eacute;sormais la queue est vide et le dernier test passe aussi. Si une autre erreur non v&eacute;rifi&eacute;e est encore dans la queue &agrave; la fin de notre m&eacute;thode de test alors une exception sera rapport&eacute;e dans le test. Notez que SimpleTest ne peut pas attraper les erreurs PHP &agrave; la compilation.
 
187
            </p>
 
188
            <p>
 
189
                Les sc&eacute;narios de test peuvent utiliser des m&eacute;thodes bien pratiques pour d&eacute;boguer le code ou pour &eacute;tendre la suite...
 
190
                <table>
 
191
<tbody>
 
192
                    <tr>
 
193
<td><span class="new_code">setUp()</span></td><td>Est lanc&eacute;e avant chaque m&eacute;thode de test</td>
 
194
</tr>
 
195
                    <tr>
 
196
<td><span class="new_code">tearDown()</span></td><td>Est lanc&eacute;e apr&egrave;s chaque m&eacute;thode de test</td>
 
197
</tr>
 
198
                    <tr>
 
199
<td><span class="new_code">pass()</span></td><td>Envoie un succ&egrave;s</td>
 
200
</tr>
 
201
                    <tr>
 
202
<td><span class="new_code">fail()</span></td><td>Envoie un &eacute;chec</td>
 
203
</tr>
 
204
                    <tr>
 
205
<td><span class="new_code">error()</span></td><td>Envoi un &eacute;v&egrave;nement exception</td>
 
206
</tr>
 
207
                    <tr>
 
208
<td><span class="new_code">sendMessage()</span></td><td>Envoie un message d'&eacute;tat aux syst&egrave;mes d'affichage qui le supporte</td>
 
209
</tr>
 
210
                    <tr>
 
211
<td><span class="new_code">signal($type, $payload)</span></td><td>Envoie un message d&eacute;fini par l'utilisateur au rapporteur du test</td>
 
212
</tr>
 
213
                    <tr>
 
214
<td><span class="new_code">dump($var)</span></td><td>Effectue un <span class="new_code">print_r()</span> format&eacute; pour du d&eacute;boguage rapide et grossier</td>
 
215
</tr>
 
216
                    <tr>
 
217
<td><span class="new_code">swallowErrors()</span></td><td>Vide les erreurs de la queue</td>
 
218
</tr>
 
219
                </tbody>
 
220
</table>
 
221
            </p>
 
222
        
 
223
        <p>
 
224
<a class="target" name="extension_unitaire">
 
225
<h2>Etendre les sc&eacute;narios de test</h2>
 
226
</a>
 
227
</p>
 
228
            <p>
 
229
                Bien s&ucirc;r des m&eacute;thodes suppl&eacute;mentaires de test peuvent &ecirc;tre ajout&eacute;es pour cr&eacute;er d'autres types de sc&eacute;nario de test afin d'&eacute;tendre le framework...
 
230
<pre>
 
231
require_once('simpletest/unit_tester.php');
 
232
<strong>
 
233
class FileTester extends UnitTestCase {
 
234
    function FileTester($name = false) {
 
235
        $this-&gt;UnitTestCase($name);
 
236
    }
 
237
    
 
238
    function assertFileExists($filename, $message = '%s') {
 
239
        $this-&gt;assertTrue(
 
240
                file_exists($filename),
 
241
                sprintf($message, 'File [$filename] existence check'));
 
242
    }</strong>
 
243
}
 
244
</pre>
 
245
                Ici la biblioth&egrave;que SimpleTest est localis&eacute;e dans un r&eacute;pertoire local appel&eacute; <em>simpletest</em>. Pensez &agrave; le modifier pour votre propre environnement.
 
246
            </p>
 
247
            <p>
 
248
                Ce nouveau sc&eacute;nario peut &ecirc;tre h&eacute;rit&eacute; exactement comme un sc&eacute;nario de test classique...
 
249
<pre>
 
250
class FileTestCase extends <strong>FileTester</strong> {
 
251
    
 
252
    function setUp() {
 
253
        @unlink('../temp/test.txt');
 
254
    }
 
255
    
 
256
    function tearDown() {
 
257
        @unlink('../temp/test.txt');
 
258
    }
 
259
    
 
260
    function testCreation() {
 
261
        $writer = &amp;new FileWriter('../temp/test.txt');
 
262
        $writer-&gt;write('Hello');<strong>
 
263
        $this-&gt;assertFileExists('../temp/test.txt');</strong>
 
264
    }
 
265
}
 
266
</pre>
 
267
            </p>
 
268
            <p>
 
269
                Si vous souhaitez un sc&eacute;nario de test sans toutes les assertions de <span class="new_code">UnitTestCase</span> mais uniquement avec les v&ocirc;tres propres, vous aurez besoin d'&eacute;tendre la classe <span class="new_code">SimpleTestCase</span> &agrave; la place. Elle se trouve dans <em>simple_test.php</em> en lieu et place de <em>unit_tester.php</em>. A consulter <a href="group_test_documentation.html">plus tard</a> si vous souhaitez incorporer les sc&eacute;narios d'autres testeurs unitaires dans votre suite de test.
 
270
            </p>
 
271
        
 
272
        <p>
 
273
<a class="target" name="lancement_unitaire">
 
274
<h2>Lancer un unique sc&eacute;nario de test</h2>
 
275
</a>
 
276
</p>
 
277
            <p>
 
278
                Ce n'est pas souvent qu'il faille lancer des sc&eacute;narios avec un unique test. Sauf lorsqu'il s'agit de s'arracher les cheveux sur un module &agrave; probl&egrave;me sans pour autant d&eacute;sorganiser la suite de test principale. Voici l'&eacute;chafaudage n&eacute;cessaire pour lancer un sc&eacute;nario de test solitaire...
 
279
<pre>
 
280
&lt;?php
 
281
    require_once('simpletest/unit_tester.php');<strong>
 
282
    require_once('simpletest/reporter.php');</strong>
 
283
    require_once('../classes/writer.php');
 
284
 
 
285
    class FileTestCase extends UnitTestCase {
 
286
        function FileTestCase() {
 
287
            $this-&gt;UnitTestCase('File test');
 
288
        }
 
289
    }<strong>
 
290
    
 
291
    $test = &amp;new FileTestCase();
 
292
    $test-&gt;run(new HtmlReporter());</strong>
 
293
?&gt;
 
294
</pre>
 
295
                Ce script sera lanc&eacute; tel que mais il n'y aura aucun succ&egrave;s ou &eacute;chec avant que des m&eacute;thodes de test soient ajout&eacute;es.
 
296
            </p>
 
297
        
 
298
    </div>
 
299
<div class="copyright">
 
300
            Copyright<br>Marcus Baker, Jason Sweat, Perrick Penet 2004
 
301
        </div>
 
302
</body>
 
303
</html>