File: unit_test_documentation.xml

package info (click to toggle)
postfixadmin 2.3.5-2%2Bdeb7u1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 6,200 kB
  • sloc: php: 25,767; xml: 14,485; perl: 964; sh: 664; python: 169; makefile: 84
file content (225 lines) | stat: -rw-r--r-- 13,487 bytes parent folder | download | duplicates (2)
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 &quot;test&quot; 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 &quot;%s&quot; 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 &quot;%s&quot; 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 &quot;Disaster&quot; 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>