source: trunk/server/www/vendors/simpletest/docs/fr/web_tester_documentation.html @ 6

Last change on this file since 6 was 6, checked in by sander, 11 years ago

Added SimpleTest? test framework

File size: 23.3 KB
Line 
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Documentation SimpleTest : tester des scripts web</title>
5<link rel="stylesheet" type="text/css" href="docs.css" title="Styles">
6</head>
7<body>
8<div class="menu_back"><div class="menu">
9<a href="index.html">SimpleTest</a>
10                |
11                <a href="overview.html">Overview</a>
12                |
13                <a href="unit_test_documentation.html">Unit tester</a>
14                |
15                <a href="group_test_documentation.html">Group tests</a>
16                |
17                <a href="mock_objects_documentation.html">Mock objects</a>
18                |
19                <a href="partial_mocks_documentation.html">Partial mocks</a>
20                |
21                <a href="reporter_documentation.html">Reporting</a>
22                |
23                <a href="expectation_documentation.html">Expectations</a>
24                |
25                <a href="web_tester_documentation.html">Web tester</a>
26                |
27                <a href="form_testing_documentation.html">Testing forms</a>
28                |
29                <a href="authentication_documentation.html">Authentication</a>
30                |
31                <a href="browser_documentation.html">Scriptable browser</a>
32</div></div>
33<h1>Documentation sur le testeur web</h1>
34        This page...
35        <ul>
36<li>
37            Réussir à <a href="#telecharger">télécharger une page web</a>
38        </li>
39<li>
40            Tester le <a href="#contenu">contenu de la page</a>
41        </li>
42<li>
43            <a href="#navigation">Naviguer sur un site web</a> pendant le test
44        </li>
45<li>
46            Méthodes pour <a href="#requete">modifier une requête</a> et pour déboguer
47        </li>
48</ul>
49<div class="content">
50        <p><a class="target" name="telecharger"><h2>Télécharger une page</h2></a></p>
51            <p>
52                Tester des classes c'est trÚs bien.
53                Reste que PHP est avant tout un langage
54                pour créer des fonctionnalités à l'intérieur de pages web.
55                Comment pouvons tester la partie de devant
56                -- celle de l'interface -- dans nos applications en PHP ?
57                Etant donné qu'une page web n'est constituée que de texte,
58                nous devrions pouvoir les examiner exactement
59                comme n'importe quelle autre donnée de test.
60            </p>
61            <p>
62                Cela nous amÚne à une situation délicate.
63                Si nous testons dans un niveau trop bas,
64                vérifier des balises avec un motif ad hoc par exemple,
65                nos tests seront trop fragiles. Le moindre changement
66                dans la présentation pourrait casser un grand nombre de test.
67                Si nos tests sont situés trop haut, en utilisant
68                une version fantaisie du moteur de template pour
69                donner un cas précis, alors nous perdons complÚtement
70                la capacité à automatiser certaines classes de test.
71                Par exemple, l'interaction entre des formulaires
72                et la navigation devra être testé manuellement.
73                Ces types de test sont extrêmement fastidieux
74                et plutÃŽt sensibles aux erreurs.
75            </p>
76            <p>
77                SimpleTest comprend une forme spéciale de scénario
78                de test pour tester les actions d'une page web.
79                <span class="new_code">WebTestCase</span> inclut des facilités pour la navigation,
80                des vérifications sur le contenu
81                et les cookies ainsi que la gestion des formulaires.
82                Utiliser ces scénarios de test ressemble
83                fortement à <span class="new_code">UnitTestCase</span>...
84<pre>
85<strong>class TestOfLastcraft extends WebTestCase {
86}</strong>
87</pre>
88                Ici nous sommes sur le point de tester
89                le site de <a href="http://www.lastcraft.com/">Last Craft</a>.
90                Si ce scénario de test est situé dans un fichier appelé
91                <em>lastcraft_test.php</em> alors il peut être chargé
92                dans un script de lancement tout comme des tests unitaires...
93<pre>
94&lt;?php
95require_once('simpletest/autorun.php');<strong>
96require_once('simpletest/web_tester.php');</strong>
97SimpleTest::prefer(new TextReporter());
98
99class WebTests extends TestSuite {
100    function WebTests() {
101        $this-&gt;TestSuite('Web site tests');<strong>
102        $this-&gt;addFile('lastcraft_test.php');</strong>
103    }
104}
105?&gt;
106</pre>
107                J'utilise ici le rapporteur en mode texte
108                pour mieux distinguer le contenu au format HTML
109                du résultat du test proprement dit.
110            </p>
111            <p>
112                Rien n'est encore testé. Nous pouvons télécharger
113                la page d'accueil en utilisant la méthode <span class="new_code">get()</span>...
114<pre>
115class TestOfLastcraft extends WebTestCase {
116    <strong>
117    function testHomepage() {
118        $this-&gt;assertTrue($this-&gt;get('http://www.lastcraft.com/'));
119    }</strong>
120}
121</pre>
122                La méthode <span class="new_code">get()</span> renverra "true"
123                uniquement si le contenu de la page a bien été téléchargé.
124                C'est un moyen simple, mais efficace pour vérifier
125                qu'une page web a bien été délivré par le serveur web.
126                Cependant le contenu peut révéler être une erreur 404
127                et dans ce cas notre méthode <span class="new_code">get()</span> renverrait encore un succÚs.
128            </p>
129            <p>
130                En supposant que le serveur web pour le site Last Craft
131                soit opérationnel (malheureusement ce n'est pas toujours le cas),
132                nous devrions voir...
133<pre class="shell">
134Web site tests
135OK
136Test cases run: 1/1, Failures: 0, Exceptions: 0
137</pre>
138                Nous avons vérifié qu'une page, de n'importe quel type,
139                a bien été renvoyée. Nous ne savons pas encore
140                s'il s'agit de celle que nous souhaitions.
141            </p>
142       
143        <p><a class="target" name="contenu"><h2>Tester le contenu d'une page</h2></a></p>
144            <p>
145                Pour obtenir la confirmation que la page téléchargée
146                est bien celle que nous attendions,
147                nous devons vérifier son contenu.
148<pre>
149class TestOfLastcraft extends WebTestCase {
150   
151    function testHomepage() {<strong>
152        $this-&gt;get('http://www.lastcraft.com/');
153        $this-&gt;assertWantedPattern('/why the last craft/i');</strong>
154    }
155}
156</pre>
157                La page obtenue par le dernier téléchargement est
158                placée dans un buffer au sein même du scénario de test.
159                Il n'est donc pas nécessaire de s'y référer directement.
160                La correspondance du motif est toujours effectuée
161                par rapport à ce buffer.
162            </p>
163            <p>
164                Voici une liste possible d'assertions sur le contenu...
165                <table><tbody>
166                    <tr>
167<td><span class="new_code">assertWantedPattern($pattern)</span></td>
168<td>Vérifier une correspondance sur le contenu via une expression rationnelle Perl</td>
169</tr>
170                    <tr>
171<td><span class="new_code">assertNoUnwantedPattern($pattern)</span></td>
172<td>Une expression rationnelle Perl pour vérifier une absence</td>
173</tr>
174                    <tr>
175<td><span class="new_code">assertTitle($title)</span></td>
176<td>Passe si le titre de la page correspond exactement</td>
177</tr>
178                    <tr>
179<td><span class="new_code">assertLink($label)</span></td>
180<td>Passe si un lien avec ce texte est présent</td>
181</tr>
182                    <tr>
183<td><span class="new_code">assertNoLink($label)</span></td>
184<td>Passe si aucun lien avec ce texte est présent</td>
185</tr>
186                    <tr>
187<td><span class="new_code">assertLinkById($id)</span></td>
188<td>Passe si un lien avec cet attribut d'identification est présent</td>
189</tr>
190                    <tr>
191<td><span class="new_code">assertField($name, $value)</span></td>
192<td>Passe si une balise input avec ce nom contient cette valeur</td>
193</tr>
194                    <tr>
195<td><span class="new_code">assertFieldById($id, $value)</span></td>
196<td>Passe si une balise input avec cet identifiant contient cette valeur</td>
197</tr>
198                    <tr>
199<td><span class="new_code">assertResponse($codes)</span></td>
200<td>Passe si la réponse HTTP trouve une correspondance dans la liste</td>
201</tr>
202                    <tr>
203<td><span class="new_code">assertMime($types)</span></td>
204<td>Passe si le type MIME se retrouve dans cette liste</td>
205</tr>
206                    <tr>
207<td><span class="new_code">assertAuthentication($protocol)</span></td>
208<td>Passe si l'authentification provoquée est de ce type de protocole</td>
209</tr>
210                    <tr>
211<td><span class="new_code">assertNoAuthentication()</span></td>
212<td>Passe s'il n'y pas d'authentification provoquée en cours</td>
213</tr>
214                    <tr>
215<td><span class="new_code">assertRealm($name)</span></td>
216<td>Passe si le domaine provoqué correspond</td>
217</tr>
218                    <tr>
219<td><span class="new_code">assertHeader($header, $content)</span></td>
220<td>Passe si une entête téléchargée correspond à cette valeur</td>
221</tr>
222                    <tr>
223<td><span class="new_code">assertNoUnwantedHeader($header)</span></td>
224<td>Passe si une entête n'a pas été téléchargé</td>
225</tr>
226                    <tr>
227<td><span class="new_code">assertHeaderPattern($header, $pattern)</span></td>
228<td>Passe si une entête téléchargée correspond à cette expression rationnelle Perl</td>
229</tr>
230                    <tr>
231<td><span class="new_code">assertCookie($name, $value)</span></td>
232<td>Passe s'il existe un cookie correspondant</td>
233</tr>
234                    <tr>
235<td><span class="new_code">assertNoCookie($name)</span></td>
236<td>Passe s'il n'y a pas de cookie avec un tel nom</td>
237</tr>
238                </tbody></table>
239                Comme d'habitude avec les assertions de SimpleTest,
240                elles renvoient toutes "false" en cas d'échec
241                et "true" si c'est un succÚs.
242                Elles renvoient aussi un message de test optionnel :
243                vous pouvez l'ajouter dans votre propre message en utilisant "%s".
244            </p>
245            <p>
246                A présent nous pourrions effectué le test sur le titre uniquement...
247<pre>
248<strong>$this-&gt;assertTitle('The Last Craft?');</strong>
249</pre>
250                En plus d'une simple vérification sur le contenu HTML,
251                nous pouvons aussi vérifier que le type MIME est bien d'un type acceptable...
252<pre>
253<strong>$this-&gt;assertMime(array('text/plain', 'text/html'));</strong>
254</pre>
255                Plus intéressant encore est la vérification sur
256                le code de la réponse HTTP. Pareillement au type MIME,
257                nous pouvons nous assurer que le code renvoyé se trouve
258                bien dans un liste de valeurs possibles...
259<pre>
260class TestOfLastcraft extends WebTestCase {
261   
262    function testHomepage() {
263        $this-&gt;get('http://simpletest.sourceforge.net/');<strong>
264        $this-&gt;assertResponse(200);</strong>
265    }
266}
267</pre>
268                Ici nous vérifions que le téléchargement s'est
269                bien terminé en ne permettant qu'une réponse HTTP 200.
270                Ce test passera, mais ce n'est pas la meilleure façon de procéder.
271                Il n'existe aucune page sur <em>http://simpletest.sourceforge.net/</em>,
272                à la place le serveur renverra une redirection vers
273                <em>http://www.lastcraft.com/simple_test.php</em>.
274                <span class="new_code">WebTestCase</span> suit automatiquement trois
275                de ces redirections. Les tests sont quelque peu plus
276                robustes de la sorte. Surtout qu'on est souvent plus intéressé
277                par l'interaction entre les pages que de leur simple livraison.
278                Si les redirections se révÚlent être digne d'intérêt,
279                il reste possible de les supprimer...
280<pre>
281class TestOfLastcraft extends WebTestCase {
282   
283    function testHomepage() {<strong>
284        $this-&gt;setMaximumRedirects(0);</strong>
285        $this-&gt;get('http://simpletest.sourceforge.net/');
286        $this-&gt;assertResponse(200);
287    }
288}
289</pre>
290                Alors l'assertion échoue comme prévue...
291<pre class="shell">
292Web site tests
2931) Expecting response in [200] got [302]
294    in testhomepage
295    in testoflastcraft
296    in lastcraft_test.php
297FAILURES!!!
298Test cases run: 1/1, Failures: 1, Exceptions: 0
299</pre>
300                Nous pouvons modifier le test pour accepter les redirections...
301<pre>
302class TestOfLastcraft extends WebTestCase {
303   
304    function testHomepage() {
305        $this-&gt;setMaximumRedirects(0);
306        $this-&gt;get('http://simpletest.sourceforge.net/');
307        $this-&gt;assertResponse(<strong>array(301, 302, 303, 307)</strong>);
308    }
309}
310</pre>
311                Maitenant ça passe.
312            </p>
313       
314        <p><a class="target" name="navigation"><h2>Navigeur dans un site web</h2></a></p>
315            <p>
316                Les utilisateurs ne naviguent pas souvent en tapant les URLs,
317                mais surtout en cliquant sur des liens et des boutons.
318                Ici nous confirmons que les informations sur le contact
319                peuvent être atteintes depuis la page d'accueil...
320<pre>
321class TestOfLastcraft extends WebTestCase {
322    ...
323    function testContact() {
324        $this-&gt;get('http://www.lastcraft.com/');<strong>
325        $this-&gt;clickLink('About');
326        $this-&gt;assertTitle('About Last Craft');</strong>
327    }
328}
329</pre>
330                Le paramÚtre est le texte du lien.
331            </p>
332            <p>
333                Il l'objectif est un bouton plutÃŽt qu'une balise ancre,
334                alors <span class="new_code">clickSubmit()</span> doit être utilisé avec
335                le titre du bouton...
336<pre>
337<strong>$this-&gt;clickSubmit('Go!');</strong>
338</pre>
339            </p>
340            <p>
341                La liste des méthodes de navigation est...
342                <table><tbody>
343                    <tr>
344<td><span class="new_code">get($url, $parameters)</span></td>
345<td>Envoie une requête GET avec ces paramÚtres</td>
346</tr>
347                    <tr>
348<td><span class="new_code">post($url, $parameters)</span></td>
349<td>Envoie une requête POST avec ces paramÚtres</td>
350</tr>
351                    <tr>
352<td><span class="new_code">head($url, $parameters)</span></td>
353<td>Envoie une requête HEAD sans remplacer le contenu de la page</td>
354</tr>
355                    <tr>
356<td><span class="new_code">retry()</span></td>
357<td>Relance la derniÚre requête</td>
358</tr>
359                    <tr>
360<td><span class="new_code">back()</span></td>
361<td>Identique au bouton "Précédent" du navigateur</td>
362</tr>
363                    <tr>
364<td><span class="new_code">forward()</span></td>
365<td>Identique au bouton "Suivant" du navigateur</td>
366</tr>
367                    <tr>
368<td><span class="new_code">authenticate($name, $password)</span></td>
369<td>Re-essaye avec une tentative d'authentification</td>
370</tr>
371                    <tr>
372<td><span class="new_code">getFrameFocus()</span></td>
373<td>Le nom de la fenêtre en cours d'utilisation</td>
374</tr>
375                    <tr>
376<td><span class="new_code">setFrameFocusByIndex($choice)</span></td>
377<td>Change le focus d'une fenêtre en commençant par 1</td>
378</tr>
379                    <tr>
380<td><span class="new_code">setFrameFocus($name)</span></td>
381<td>Change le focus d'une fenêtre en utilisant son nom</td>
382</tr>
383                    <tr>
384<td><span class="new_code">clearFrameFocus()</span></td>
385<td>Revient à un traitement de toutes les fenêtres comme une seule</td>
386</tr>
387                    <tr>
388<td><span class="new_code">clickSubmit($label)</span></td>
389<td>Clique sur le premier bouton avec cette étiquette</td>
390</tr>
391                    <tr>
392<td><span class="new_code">clickSubmitByName($name)</span></td>
393<td>Clique sur le bouton avec cet attribut de nom</td>
394</tr>
395                    <tr>
396<td><span class="new_code">clickSubmitById($id)</span></td>
397<td>Clique sur le bouton avec cet attribut d'identification</td>
398</tr>
399                    <tr>
400<td><span class="new_code">clickImage($label, $x, $y)</span></td>
401<td>Clique sur une balise input de type image par son titre (title="*") our son texte alternatif (alt="*")</td>
402</tr>
403                    <tr>
404<td><span class="new_code">clickImageByName($name, $x, $y)</span></td>
405<td>Clique sur une balise input de type image par son attribut (name="*")</td>
406</tr>
407                    <tr>
408<td><span class="new_code">clickImageById($id, $x, $y)</span></td>
409<td>Clique sur une balise input de type image par son identifiant (id="*")</td>
410</tr>
411                    <tr>
412<td><span class="new_code">submitFormById($id)</span></td>
413<td>Soumet un formulaire sans valeur de soumission</td>
414</tr>
415                    <tr>
416<td><span class="new_code">clickLink($label, $index)</span></td>
417<td>Clique sur une ancre avec ce texte d'étiquette visible</td>
418</tr>
419                    <tr>
420<td><span class="new_code">clickLinkById($id)</span></td>
421<td>Clique sur une ancre avec cet attribut d'identification</td>
422</tr>
423                </tbody></table>
424            </p>
425            <p>
426                Les paramÚtres dans les méthodes <span class="new_code">get()</span>,
427                <span class="new_code">post()</span> et <span class="new_code">head()</span> sont optionnels.
428                Le téléchargement via  HTTP HEAD ne modifie pas
429                le contexte du navigateur, il se limite au chargement des cookies.
430                Cela peut être utilise lorsqu'une image ou une feuille de style
431                initie un cookie pour bloquer un robot trop entreprenant.
432            </p>
433            <p>
434                Les commandes <span class="new_code">retry()</span>, <span class="new_code">back()</span>
435                et <span class="new_code">forward()</span> fonctionnent exactement comme
436                dans un navigateur. Elles utilisent l'historique pour
437                relancer les pages. Une technique bien pratique pour
438                vérifier les effets d'un bouton retour sur vos formulaires.
439            </p>
440            <p>
441                Les méthodes sur les fenêtres méritent une petite explication.
442                Par défaut, une page avec des fenêtres est traitée comme toutes
443                les autres. Le contenu sera vérifié à travers l'ensemble de
444                la "frameset", par conséquent un lien fonctionnera,
445                peu importe la fenêtre qui contient la balise ancre.
446                Vous pouvez outrepassé ce comportement en exigeant
447                le focus sur une unique fenêtre. Si vous réalisez cela,
448                toutes les recherches et toutes les actions se limiteront
449                à cette unique fenêtre, y compris les demandes d'authentification.
450                Si un lien ou un bouton n'est pas dans la fenêtre en focus alors
451                il ne peut pas être cliqué.
452            </p>
453            <p>
454                Tester la navigation sur des pages fixes ne vous alerte que
455                quand vous avez cassé un script entier.
456                Pour des pages fortement dynamiques,
457                un forum de discussion par exemple,
458                ça peut être crucial pour vérifier l'état de l'application.
459                Pour la plupart des applications cependant,
460                la logique vraiment délicate se situe dans la gestion
461                des formulaires et des sessions.
462                Heureusement SimpleTest aussi inclut
463                <a href="form_testing_documentation.html">
464                des outils pour tester des formulaires web</a>.
465            </p>
466       
467        <p><a class="target" name="requete"><h2>Modifier la requête</h2></a></p>
468            <p>
469                Bien que SimpleTest n'ait pas comme objectif
470                de contrÃŽler des erreurs réseau, il contient quand même
471                des méthodes pour modifier et déboguer les requêtes qu'il lance.
472                Voici une autre liste de méthode...
473                <table><tbody>
474                    <tr>
475<td><span class="new_code">getTransportError()</span></td>
476<td>La derniÚre erreur de socket</td>
477</tr>
478                    <tr>
479<td><span class="new_code">getUrl()</span></td>
480<td>La localisation courante</td>
481</tr>
482                    <tr>
483<td><span class="new_code">showRequest()</span></td>
484<td>Déverse la requête sortante</td>
485</tr>
486                    <tr>
487<td><span class="new_code">showHeaders()</span></td>
488<td>Déverse les entêtes d'entrée</td>
489</tr>
490                    <tr>
491<td><span class="new_code">showSource()</span></td>
492<td>Déverse le contenu brut de la page HTML</td>
493</tr>
494                    <tr>
495<td><span class="new_code">ignoreFrames()</span></td>
496<td>Ne recharge pas les framesets</td>
497</tr>
498                    <tr>
499<td><span class="new_code">setCookie($name, $value)</span></td>
500<td>Initie un cookie à partir de maintenant</td>
501</tr>
502                    <tr>
503<td><span class="new_code">addHeader($header)</span></td>
504<td>Ajoute toujours cette entête à la requête</td>
505</tr>
506                    <tr>
507<td><span class="new_code">setMaximumRedirects($max)</span></td>
508<td>S'arrête aprÚs autant de redirections</td>
509</tr>
510                    <tr>
511<td><span class="new_code">setConnectionTimeout($timeout)</span></td>
512<td>Termine la connexion aprÚs autant de temps entre les bytes</td>
513</tr>
514                    <tr>
515<td><span class="new_code">useProxy($proxy, $name, $password)</span></td>
516<td>Effectue les requêtes à travers ce proxy d'URL</td>
517</tr>
518                </tbody></table>
519            </p>
520       
521    </div>
522        References and related information...
523        <ul>
524<li>
525            La page du projet SimpleTest sur
526            <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
527        </li>
528<li>
529            La page de téléchargement de SimpleTest sur
530            <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
531        </li>
532<li>
533            <a href="http://simpletest.org/api/">L'API du développeur pour SimpleTest</a>
534            donne tous les détails sur les classes et les assertions disponibles.
535        </li>
536</ul>
537<div class="menu_back"><div class="menu">
538<a href="index.html">SimpleTest</a>
539                |
540                <a href="overview.html">Overview</a>
541                |
542                <a href="unit_test_documentation.html">Unit tester</a>
543                |
544                <a href="group_test_documentation.html">Group tests</a>
545                |
546                <a href="mock_objects_documentation.html">Mock objects</a>
547                |
548                <a href="partial_mocks_documentation.html">Partial mocks</a>
549                |
550                <a href="reporter_documentation.html">Reporting</a>
551                |
552                <a href="expectation_documentation.html">Expectations</a>
553                |
554                <a href="web_tester_documentation.html">Web tester</a>
555                |
556                <a href="form_testing_documentation.html">Testing forms</a>
557                |
558                <a href="authentication_documentation.html">Authentication</a>
559                |
560                <a href="browser_documentation.html">Scriptable browser</a>
561</div></div>
562<div class="copyright">
563            Copyright<br>Marcus Baker 2006
564        </div>
565</body>
566</html>
Note: See TracBrowser for help on using the repository browser.