File: display_subclass_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 (214 lines) | stat: -rw-r--r-- 11,371 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
<?xml version="1.0" encoding="ISO-8859-1" ?>
<page title="Changer l'affichage du test" here="Changer l'affichage du test">
    <long_title>Tutorial de test unitaire en PHP - Sous-classer l'affichage du test</long_title>
    <content>
        <p>
            Le composant affichage de SimpleTest est en fait la dernire partie  dvelopper. Des morceaux de la section suivante changeront prochainement et -- avec optimisme -- des composants d'affichage plus sophistiqus seront crits, mais pour l'instant si un affichage minime n'est pas suffisant, voici comment raliser le votre.
        </p>
        <p>
            <a class="target" name="succs"><h2>Je veux voir les succs !</h2></a>
        </p>
        <p>
            Bon d'accord, voici comment.
        </p>
        <p>
            Nous devons crer une sous-classe de l'affichage utilise, dans notre cas il s'agit de <code>HtmlReporter</code>. La classe <code>HtmlReporter</code> est situ dans le fichier <em>simpletest/reporter.php</em> : pour l'instant elle a l'interface suivante...
<php><![CDATA[
class HtmlReporter extends TestDisplay {
    public TestHtmlDisplay() { ... }
    public void paintHeader(string $test_name) { ... }
    public void paintFooter(string $test_name) { ... }
    public void paintStart(string $test_name, $size) { ... }
    public void paintEnd(string $test_name, $size) { ... }
    public void paintFail(string $message) { ... }
    public void paintPass(string $message) { ... }
    protected string _getCss() { ... }
    public array getTestList() { ... }
    public integer getPassCount() { ... }
    public integer getFailCount() { ... }
    public integer getTestCaseCount() { ... }
    public integer getTestCaseProgress { ... }
}
]]></php>
            Voici ce que les mthodes pertinentes veulent dire. Vous pouvez consulter la <a href="reporter_documentation.php#html">liste complte ici</a> si cela vous intresse.
            <ul class="api">
                <li>
                    <code>HtmlReporter()</code><br />
                    est le constructeur. Notez qu'un test unitaire initie le lien vers l'affichage plutt que l'inverse. L'affichage est un rceptacle passif des vnements de test. Cela permet une adaptation facile de l'affichage pour d'autres systmes de test en dehors des tests unitaires comme la surveillance de serveurs par exemple. Autre avantage, un test unitaire peut crire vers plus d'un affichage  la fois.
                </li>
                <li>
                    <code>void paintFail(string $message)</code><br />
                    peint un chec. Voir ci-dessous.
                </li>
                <li>
                    <code>void paintPass(string \$message)</code><br />
                    ne fait rien par dfaut. C'est cette mthode que nous allons modifier.
                </li>
                <li>
                    <code>string _getCss()</code><br />
                    renvoie le style CSS - via une chane - pour la mthode d'entte de la page. Des styles complmentaires peuvent tre ajouts ici.
                </li>
                <li>
                    <code>array getTestList()</code><br />
                    est une mthode commode pour des sous-classes. Elle liste l'embotement courant des tests via une liste de noms de test. Le premier, le test embot le plus profondment, est le premier dans la liste et la mthode du test courant sera la dernire.
                </li>
            </ul>
        </p>
        <p>
            Pour afficher les succs nous avons juste besoin que la mthode <code>paintPass()</code> se comporte comme <code>paintFail()</code>. Bien sr nous n'allons pas modifier l'original. Nous allons juste crer une sous-classe.
        </p>
        <p>
            <a class="target" name="sous-classe"><h2>Une sous-classe d'affichage</h2></a>
        </p>
        <p>
            Premirement nous allons crer un fichier <em>tests/show_passes.php</em> dans notre projet de log et y placer cette classe vide...
<php><![CDATA[
<strong><?php
    if (! defined('SIMPLE_TEST')) {
        define('SIMPLE_TEST', 'simpletest/');
    }
    require_once(SIMPLE_TEST . 'reporter.php');
    
    class ShowPasses extends HtmlReporter {
        
        function ShowPasses() {
            $this->HtmlReporter();
        }
    }
?>
]]></php>
            Une rapide mais attentive lecture du <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/simpletest/simpletest/reporter.php?content-type=text/vnd.viewcvs-markup">code de SimpleTest</a> indique que l'implmentation de <code>paintFail()</code> ressemble ...
<php><![CDATA[
function paintFail($message) {
    parent::paintFail($message);
    print "<span class=\"fail\">Fail</span>: ";
    $breadcrumb = $this->getTestList();
    array_shift($breadcrumb);
    print implode("-&gt;", $breadcrumb);
    print "-&gt;$message<br />\n";
}
]]></php>
            Essentiellement elle s'enchane  la version du parent, que nous devons aussi raliser pour garantir le mnage, et ensuite imprime une trace calcule  partir de la liste des tests courants. Par contre elle perd au passage le nom du test du premier niveau. Etant donn qu'il est identique pour chaque test, ce serait un peu trop d'informations. En la transposant dans notre nouvelle classe...
<php><![CDATA[
class ShowPasses extends HtmlReporter {
    
    function ShowPasses() {
        $this->HtmlReporter();
    }
    <strong>
    function paintPass($message) {
        parent::paintPass($message);
        print "<span class=\"pass\">Pass</span>: ";
        $breadcrumb = $this->getTestList();
        array_shift($breadcrumb);
        print implode("-&gt;", $breadcrumb);
        print "-&gt;$message<br />\n";
    }</strong>
}
]]></php>
            Pour l'instant tout roule. Maintenant pour utiliser notre nouvelle classe, nous allons modifier notre fichier <em>tests/all_tests.php</em>...
<php><![CDATA[
<?php
    if (! defined('SIMPLE_TEST')) {
        define('SIMPLE_TEST', 'simpletest/');
    }
    require_once(SIMPLE_TEST . 'unit_tester.php');<strong>
    require_once('show_passes.php');</strong>

    $test = &new GroupTest('All tests');
    $test->addTestFile('log_test.php');
    $test->addTestFile('clock_test.php');
    $test->run(<strong>new ShowPasses()</strong>);
?>
]]></php>
            Nous pouvons le lancer pour voir le rsultat de notre bricolage...
            <div class="demo">
                <h1>All tests</h1>
                Pass: log_test.php-&gt;Log class test-&gt;testappendingtofile-&gt;Expecting [/Test line 1/] in [Test line 1]<br />
                Pass: log_test.php-&gt;Log class test-&gt;testappendingtofile-&gt;Expecting [/Test line 2/] in [Test line 2]<br />
                Pass: log_test.php-&gt;Log class test-&gt;testcreatingnewfile-&gt;Created before message<br />
                Pass: log_test.php-&gt;Log class test-&gt;testcreatingnewfile-&gt;File created<br />
                Pass: clock_test.php-&gt;Clock class test-&gt;testclockadvance-&gt;Advancement<br />
                Pass: clock_test.php-&gt;Clock class test-&gt;testclocktellstime-&gt;Now is the right time<br />
                <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">3/3 test cases complete.
                <strong>6</strong> passes and <strong>0</strong> fails.</div>
            </div>
            Joli, mais pas encore digne d'une mdaille d'or. Nous avons perdu un peu d'information au passage. L'affichage du <code>span.pass</code> n'est pas styl en CSS, mais nous pouvons l'ajouter en modifiant une autre mthode...
<php><![CDATA[
class ShowPasses extends HtmlReporter {
    
    function ShowPasses() {
        $this->HtmlReporter();
    }
    
    function paintPass($message) {
        parent::paintPass($message);
        print "<span class=\"pass\">Pass</span>: ";
        $breadcrumb = $this->getTestList();
        array_shift($breadcrumb);
        print implode("-&gt;", $breadcrumb);
        print "->$message<br />\n";
    }
    <strong>
    function _getCss() {
        return parent::_getCss() . ' .pass { color: green; }';
    }</strong>
}
]]></php>
            Si vous ajoutez le code au fur et  mesure, vous verrez l'ajout du style dans le code source du rsultat via le navigateur. A l'oeil, l'affichage devrait ressembler ...
            <div class="demo">
                <h1>All tests</h1>
                <span class="pass">Pass</span>: log_test.php-&gt;Log class test-&gt;testappendingtofile-&gt;Expecting [/Test line 1/] in [Test line 1]<br />
                <span class="pass">Pass</span>: log_test.php-&gt;Log class test-&gt;testappendingtofile-&gt;Expecting [/Test line 2/] in [Test line 2]<br />
                <span class="pass">Pass</span>: log_test.php-&gt;Log class test-&gt;testcreatingnewfile-&gt;Created before message<br />
                <span class="pass">Pass</span>: log_test.php-&gt;Log class test-&gt;testcreatingnewfile-&gt;File created<br />
                <span class="pass">Pass</span>: clock_test.php-&gt;Clock class test-&gt;testclockadvance-&gt;Advancement<br />
                <span class="pass">Pass</span>: clock_test.php-&gt;Clock class test-&gt;testclocktellstime-&gt;Now is the right time<br />
                <div style="padding: 8px; margin-top: 1em; background-color: green; color: white;">3/3 test cases complete.
                <strong>6</strong> passes and <strong>0</strong> fails.</div>
            </div>
            Certains prfrent voir les succs quand ils travaillent sur le code; le sentiment de travail achev est sympathique aprs tout. Une fois que vous commencez  naviguer de haut en bas pour trouver les erreurs, assez vite vous en comprendrez le ct obscur.
        </p>
        <p>
            Essayez les deux mthodes pour dterminer votre prfrence. Nous allons le laisser tel que pour l'tape qui approche : <a href="mock_objects_tutorial.php">les objets fantaisie</a>. Il s'agit du premier outil de test qui ajoute des tests additionnels : il sera utile de voir ce qui se passe dans les coulisses.
        </p>
    </content>
    <internal>
        <link>
            Comment changer l'affichage pour <a href="#succs">afficher les passages avec succs</a>.
        </link>
        <link>
            <a href="#sous-classe">Sous classer la classe <code>HtmlReporter</code></a>.
        </link>
    </internal>
    <external>
        <link>
            La section prcdente : <a href="subclass_tutorial.php">sous-classer les scnarios de test</a>
        </link>
        <link>
            Cette section est trs spcifique  <a href="simple_test.php">SimpleTest</a>. Si vous utilisez un autre outil, n'hsitez pas  sauter pardessus.
        </link>
    </external>
    <meta>
        <keywords>
            dveloppement logiciel pilot par les tests,
            conseil pour programmer en php,
            programmation php,
            outils de dveloppement logiciel,
            tutorial php,
            scripts php gratuits,
            architecture,
            exemple de scnario de test,
            framework de tests unitaires,
            ressources php,
            exemple de code php,
            junit,
            phpunit,
            simpletest,
            test php,
            outil de test unitaire,
            suite de test php
        </keywords>
    </meta>
</page>