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("->", $breadcrumb);
print "->$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("->", $breadcrumb);
print "->$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->Log class test->testappendingtofile->Expecting [/Test line 1/] in [Test line 1]<br />
Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 2/] in [Test line 2]<br />
Pass: log_test.php->Log class test->testcreatingnewfile->Created before message<br />
Pass: log_test.php->Log class test->testcreatingnewfile->File created<br />
Pass: clock_test.php->Clock class test->testclockadvance->Advancement<br />
Pass: clock_test.php->Clock class test->testclocktellstime->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("->", $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->Log class test->testappendingtofile->Expecting [/Test line 1/] in [Test line 1]<br />
<span class="pass">Pass</span>: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 2/] in [Test line 2]<br />
<span class="pass">Pass</span>: log_test.php->Log class test->testcreatingnewfile->Created before message<br />
<span class="pass">Pass</span>: log_test.php->Log class test->testcreatingnewfile->File created<br />
<span class="pass">Pass</span>: clock_test.php->Clock class test->testclockadvance->Advancement<br />
<span class="pass">Pass</span>: clock_test.php->Clock class test->testclocktellstime->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>
|