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 "test". Seules les mthodes commenant par "test" 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>
|