File: group_test_tutorial.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 (198 lines) | stat: -rw-r--r-- 9,111 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
<?xml version="1.0" encoding="ISO-8859-1" ?>
<page title="Grouper des tests" here="Grouper des tests">
    <long_title>
        Tutorial de test unitaire PHP - Grouper des tests unitaires et exemples d'criture de scnarios de tests
    </long_title>
    <content>
        <p>
            Pour enchaner nous allons remplir des blancs et crer une suite de tests.
        </p>
        <p>
            <a class="target" name="autre"><h2>Un autre test</h2></a>
        </p>
        <p>
            Ajouter un autre test peut tre aussi simple qu'ajouter une nouvelle mthode  un scnario de test...
<php><![CDATA[
class TestOfLogging extends UnitTestCase {
    function TestOfLogging() {
        $this->UnitTestCase('Log class test');
    }
    function testCreatingNewFile() {
        @unlink('../temp/test.log');
        $log = new Log('../temp/test.log');
        $this->assertFalse(file_exists('../temp/test.log'), 'Created before message');
        $log->message('Should write this to a file');
        $this->assertTrue(file_exists('../temp/test.log'), 'File created');<strong>
        @unlink('../temp/test.log');</strong>
    }<strong>
    function testAppendingToFile() {
        @unlink('../temp/test.log');
        $log = new Log('../temp/test.log');
        $log->message('Test line 1');
        $messages = file('../temp/test.log');
        $this->assertWantedPattern('/Test line 1/', $messages[0]);
        $log->message('Test line 2');
        $messages = file('../temp/test.log');
        $this->assertWantedPattern('/Test line 2/', $messages[1]);
        @unlink('../temp/test.log');
    }</strong>
}
]]></php>
            La mthode du scnario de test <code>assertWantedPattern()</code> utilise les expressions rationnelles Perl pour vrifier qu'une chane respecte un certain motif.
        </p>
        <p>
            Tout ce que nous faisons dans ce nouveau test, c'est crire une ligne dans un fichier, puis la lire, le tout deux fois de suite. Nous souhaitons  simplement vrifier que le loggueur ajoute le texte  la fin plutt qu'craser les donnes dj existantes. Quelque peu pdant, mais aprs tout il s'agit d'un tutorial !
        </p>
        <p>
            De toute faon ce test passe directement...
            <div class="demo">
                <h1>Log class test</h1>
                <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
                <strong>4</strong> passes and <strong>0</strong> fails.</div>
            </div>
            Notre code contient actuellement beaucoup de rptitions, nous devons effacer le fichier de test avant et aprs chaque test. De mme que <a href="http://www.junit.org/">JUnit</a>, SimpleTest utilise les mthodes <code>setUp()</code> et <code>tearDown()</code> qui sont excutes respectivement avant et aprs chaque test. La suppression du fichier est commune  tous les tests : nous devrions donc y mettre cette opration.
        </p>
        <p>
            Nos tests sont verts donc nous pouvons faire un peu de remaniement...
<php><![CDATA[
class TestOfLogging extends UnitTestCase {
    function TestOfLogging() {
        $this->UnitTestCase('Log class test');
    }<strong>
    function setUp() {
        @unlink('../temp/test.log');
    }
    function tearDown() {
        @unlink('../temp/test.log');
    }
    function testCreatingNewFile() {</strong>
        $log = new Log('../temp/test.log');
        $this->assertFalse(file_exists('../temp/test.log'), 'Created before message');
        $log->message('Should write this to a file');
        $this->assertTrue(file_exists('../temp/test.log'), 'File created');<strong>
    }
    function testAppendingToFile() {</strong>
        $log = new Log('../temp/test.log');
        $log->message('Test line 1');
        $messages = file('../temp/test.log');
        $this->assertWantedPattern('/Test line 1/', $messages[0]);
        $log->message('Test line 2');
        $messages = file('../temp/test.log');
        $this->assertWantedPattern('/Test line 2/', $messages[1]);<strong>
    }</strong>
}
]]></php>
            Le test reste vert. Nous pouvons continuer  ajouter des mthodes sans test au scnario, il suffit que leur nom ne commence pas par la chane &quot;test&quot;. Seules les mthodes commenant par &quot;test&quot; sont excutes. Nous pouvons donc continuer le remaniement...
<php><![CDATA[
class TestOfLogging extends UnitTestCase {
    function TestOfLogging() {
        $this->UnitTestCase('Log class test');
    }
    function setUp() {
        @unlink('../temp/test.log');
    }
    function tearDown() {
        @unlink('../temp/test.log');
    }<strong>
    function getFileLine($filename, $index) {
        $messages = file($filename);
        return $messages[$index];
    }</strong>
    function testCreatingNewFile() {
        $log = new Log('../temp/test.log');
        $this->assertFalse(file_exists('../temp/test.log'), 'Created before message');
        $log->message('Should write this to a file');
        $this->assertTrue(file_exists('../temp/test.log'), 'File created');
    }
    function testAppendingToFile() {
        $log = new Log('../temp/test.log');
        $log->message('Test line 1');<strong>
        $this->assertWantedPattern('/Test line 1/', $this->getFileLine('../temp/test.log', 0));</strong>
        $log->message('Test line 2');<strong>
        $this->assertWantedPattern('/Test line 2/', $this->getFileLine('../temp/test.log', 1));</strong>
    }
}
]]></php>
            Que vous prfriez cette version ou la prcdente ne dpend que de votre got personnel. Il y a un peu plus de code dans cette dernire mais la logique du test est plus claire.
        </p>
        <p>
            <a class="target" name="groupe"><h2>Un groupe de tests</h2></a>
            Un scnario de test ne fonctionne pas tout seul pendant trs longtemps. Quand on code pour de vrai nous souhaitons excuter un maximum de tests aussi souvent et aussi rapidement que possible. a veut dire les grouper dans des suites de tests qui incluent l'ensemble des tests de l'application.
        </p>
        <p>
            Premirement nous devons supprimer le code d'excution des tests se trouvant dans notre scnario de test.
<php><![CDATA[
<?php<strong>
    require_once('../classes/log.php');

    class TestOfLogging extends UnitTestCase {
        ...
    }</strong>
?>
]]></php>
            Nous n'avons plus besoin de la constante <code>SIMPLE_TEST</code>. Ensuite nous crons un groupe de tests appel <em>all_tests.php</em> dans le rpertoire <em>tests</em>...
<php><![CDATA[
<strong><?php
    if (! defined('SIMPLE_TEST')) {
        define('SIMPLE_TEST', 'simpletest/');
    }
    require_once(SIMPLE_TEST . 'unit_tester.php');
    require_once(SIMPLE_TEST . 'reporter.php');
    require_once('log_test.php');

    $test = &new GroupTest('All tests');
    $test->addTestCase(new TestOfLogging());
    $test->run(new HtmlReporter());
?></strong>
]]></php>
            Il n'y a presque de pas de diffrence tant que les choses marchent...
            <div class="demo">
                <h1>All tests</h1>
                <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">1/1 test cases complete.
                <strong>4</strong> passes and <strong>0</strong> fails.</div>
            </div>
            Les tests du groupe s'ajoutent au compteur des scnarios de test. Ajouter des nouveaux scnarios de test est trs simple. Il suffit d'inclure le fichier d'un scnario et d'ajouter individuellement tous les scnarios autonomes. Vous pouvez aussi emboter les groupes de test les uns dans les autres (tout en faisant bien attention d'viter les boucles).
        </p>
        <p>
            Dans la <a href="gain_control_tutorial.php">page suivante</a> nous les ajouterons encore plus rapidement.
        </p>
    </content>
    <internal>
        <link>
            <a href="#autre">Ajouter un autres test</a> au scnario existant et remanier.
        </link>
        <link>
            La technique brute pour <a href="#groupe">grouper des tests unitaires</a>.
        </link>
    </internal>
    <external>
        <link>
            <a href="gain_control_tutorial.php">Ensuite</a> vient le contrle de comment la classe sous le test interagit avec le reste du systme.
        </link>
        <link>
            <a href="first_test_tutorial.php">Avant</a> il y a la cration du premier test.
        </link>
        <link>
            Vous aurez besoin de <a href="simple_test.php">SimpleTest</a> pour excuter ces exemples.
        </link>
    </external>
    <meta>
        <keywords>
            dveloppement logiciel,
            programmation php,
            outils de dveloppement logiciel,
            tutorial php,
            scripts php gratuits,
            pilotage par les tests,
            architecture,
            ressouces php,
            objets fantaisie,
            junit,
            test php,
            test unitaire,
            phpunit,
            test unitaire php
        </keywords>
    </meta>
</page>