projman/hlp/fr/tcl/tcltest.html
2015-10-19 14:27:31 +04:00

310 lines
38 KiB
HTML

<HTML><HEAD>
<BASEFONT FACE="Times New Roman" SIZE="2" COLOR="#000000">
</HEAD>
<BODY>
<div><H3><b>Tcltest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Commandes internes Tcl</b></H3></div>
<HR ALIGN="center">
<div><b>NOM</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Tcltest -&nbsp; Support du système de test et utilitaires<br>
</div><br>
<div><b>SYNTAXE</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;"><b>package require tcltest ?1.0?</b> <br>
<b>::tcltest::test </b><i>name desc ?constraint? script expectedAnswer</i> <br>
<b>::tcltest::cleanupTests </b><i>?runningMultipleTests?</i> <br>
<b>::tcltest::getMatchingTestFiles</b> <br>
<b>::tcltest::loadTestedCommands</b> <br>
<b>::tcltest::makeFile </b><i>contents name</i> <br>
<b>::tcltest::removeFile </b><i>name</i> <br>
<b>::tcltest::makeDirectory </b><i>name</i> <br>
<b>::tcltest::removeDirectory </b><i>name</i> <br>
<b>::tcltest::viewFile </b><i>name</i> <br>
<b>::tcltest::normalizeMsg </b><i>msg</i> <br>
<b>::tcltest::bytestring </b><i>string</i> <br>
<b>::tcltest::saveState</b> <br>
<b>::tcltest::restoreState</b> <br>
<b>::tcltest::threadReap</b> <br>
</div><br>
<div><b>DESCRIPTION</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Le package <b>tcltest</b> fournit à l'utilisateur des utilitaires pour écrire et faire fonctionner des tests dans le système de test Tcl. Il peut également être utilisé pour créer un système de test personnalisé pour une extension.</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Le système de test Tcl comporte de multiples fichiers .test, chacun d'entre eux comprenant plusieurs cas de test. Chaque test comporte un appel à la commande test, qui indique le nom du test, une description brève, les contraintes qui s'appliquent au cas testé, le script à exécuter, et les résultats attendus. Voir les sections <i>&quot;Tests&quot;</i>, <i>&quot;Contraintes de test&quot;</i>, et <i>&quot; Faire </i><i>fonctionner les fichiers de test &quot;</i> pour plus d'informations.
<br>Il est également possible d'enrichir ce système de test pour mettre en place votre propre système de test sur mesure. Pour plus d'information, voir la section <i>&quot;Personnaliser le système </i><i>de test&quot;</i>.
<br>Cette approche pour tester a été conçue et initialement mise en place par Mary Ann May-Pumphrey de Sun Microsystems au début des années 1990. Nous lui adressons de sincères remerciements pour avoir fait don de son travail au profit de la version publique de Tcl.</div>
<br><div><b>COMMANDES</b></div>
<br><div ALIGN="LEFT" style="margin-left: 51px;">
<DL>
<DT> <b>::tcltest::test</b> <i>name desc ?constraints? script expectedAnswer</i></DT><DD>La commande <b>::tcltest::test</b> lance <i>script</i> et compare son résultat à <i>expectedAnswer</i>. Elle imprime un message d'erreur si les deux ne correspondent pas. Si<b>::tcltest::verbose</b> contient &quot;p&quot; ou &quot;s&quot;, elle imprime aussi un message si le test réussit (p: <i>passed</i>) ou a été omis (s: <i>skipped</i>). Le test sera omis s'il ne correspond pas à la variable <b>::tcltest::match</b>, s'il correspond à l'un des éléments de <b>::tcltest::skip</b>, ou si l'un des éléments de <i>constraints</i> s'avère ne pas être vrai. La commande <b>::tcltest::test</b> n'a pas de valeur de retour définie. Voir la section <i>&quot;Ecrire un nouveau </i><i>test&quot;</i> pour plus d'informations sur cette commande.</DD>
<DT><b>::tcltest::cleanupTests</b> <i>?runningMultipleTests?</i></DT><DD>Cette commande doit normalement être appelée à la fin d'un fichier de test. Elle imprime des statistiques au sujet des tests éxécutés et supprime les fichiers créés par <b>::tcltest::makeDirectory</b> et <b>::tcltest::makeFile</b>. Les noms des fichiers et répertoires créés en dehors de <b>::tcltest::makeFile</b> et <b>::tcltest::makeDirectory</b>, et qui n'ont jamais été détruits, sont affichés dans <b>::tcltest::outputChannel</b>. Cette commande restaure également l'environnement d'éxécution initial, tel que décrit par le tableau ::env.<i>calledFromAll</i> doit normalement être indiqué quand <b>::tcltest::cleanupTests</b> est appelé depuis un fichier &quot;all.tcl&quot;. Des fichiers Tcl sont généralement utilisés pour exécuter des tests multiples. Pour plus d'information sur comment exécuter des tests multiples, voir la section <i>&quot;Exécuter des fichiers de test&quot;</i>. Cette procédure n'a pas de valeur de retour définie. </DD>
<DT><b>::tcltest::getMatchingTestFiles</b></DT><DD>Cette commande est utilisée quand vous voulez exécuter plusieurs fichiers de test. Elle retourne la liste des tests qui doivent être sourcés dans un fichier &quot;all.tcl&quot;. Voir la section <i>&quot;Exécuter des fichiers de test&quot;</i> pour plus d'informations.</DD>
<DT><b>::tcltest::loadTestedCommands</b></DT><DD>Cette commande utilise le script indiqué par l'option <i>-load</i> ou <i>-loadfile</i> pour charger les commandes testées par le système de test. Autorisée à être vide, dans le cas où; les commandes testées sont accumulées dans&nbsp; l'interpréteur qui éxécute le système de test.</DD>
<DT><b>::tcltest::makeFile</b> <i>contents name</i><br></DT><DD>Crée un fichier qui sera automatiquement supprimé par <b>::tcltest::cleanupTests </b>à la fin du fichier de test. Cette procédure n'a pas de valeur de retour définie.</DD>
<DT><b>::tcltest::removeFile</b> <i>name</i><br></DT><DD>Force la suppression du fichier référencé par <i>name</i>. Ce nom de fichier doit être indiqué en référence au <i>::tcltest::temporaryDirectory</i>. Cette procédure n'a pas de valeur de retour définie.</DD>
<DT><b>::tcltest::makeDirectory</b> <i>name</i></DT><DD>Crée un répertoire <i>name</i>, qui sera automatiquement supprimé par <b>::tcltest::cleanupTests </b>à la fin du fichier de test. Cette procédure n'a pas de valeur de retour définie.</DD>
<DT><b>::tcltest::removeDirectory</b> <i>name</i><br></DT><DD>Force la suppression du fichier référencé par <i>name</i>. Cette procédure n'a pas de valeur de retour définie.</DD>
<DT><b>::tcltest::viewFile</b> <i>file</i><br></DT><DD>Renvoie le contenu de <i>file</i>.</DD>
<DT><b>::tcltest::normalizeMsg</b> <i>msg</i><br></DT><DD>Retire les fins de lignes superflues de <i>msg</i>. </DD>
<DT><b>::tcltest::bytestring</b> <i>string</i><br></DT><DD>Construit une chaîne qui se compose de la suite des octets demandés, et non la chaîne formée de caractères UTF-8 corrects, à partir de la valeur de <i>string</i>. Cela permet au testeur de créer des chaînes dénormalisées ou impropement formées, pour les passer à des procédures C qui sont supposées accepter des chaînes comprenant des NULL, et confirmer que le résultat sous forme de chaîne correspond bien à la suite d'octets prévue.</DD>
<DT><b>::tcltest::saveState</b><br></DT><DD>et <b>::tcltest::restoreState</b> sauvent et restaurent les procédures et les variables globales. Un fichier de test peut contenir des appels à <b>::tcltest::saveState</b> et <b>::tcltest:restoreState</b> s'il crée des variables globales ou des procédures.</DD>
<DT><b>::tcltest::threadReap</b><br></DT><DD><b>::tcltest::threadReap</b> fonctionne seulement si <i>testthread</i> est défini, généralement en compilant tcltest. Si <i>testthread</i> est défini, <b>::tcltest::threadReap</b> tue tous les threads à l'exception du thread principal. Il récupère l'ID du thread principal en appelant <i>testthread names</i> pendant l'initialisation. Cette valeur est stockée dans <i>::tcltest::mainThread</i>.&nbsp; <b>::tcltest::threadReap </b>retourne le nombre de threads existants en tout. (?)</DD>
</DL>
</div><br>
<div><b>TESTS</b></div><br>
<b></b><div ALIGN="LEFT" style="margin-left: 51px;">La procédure <b>test </b>éxécute un script de test est affiche un message d'erreur si le résultat du script ne correspond pas au résultat attendu. Voici la spécification de la commande <b>test</b> : </div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">test &lt;name&gt; &lt;description&gt; ?&lt;constraint&gt;? &lt;script&gt; &lt;expectedAnswer&gt;<br>
</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">L'argument &lt;name&gt; doit obéir au motif:</div>
<div ALIGN="LEFT" style="margin-left: 51px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&gt;-&lt;majorNum&gt;.&lt;minorNum&gt;</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">Pour les tests &quot;en boîte blanche&quot; (tests de régression), la cible &lt;target &gt; doit être le nom de la fonction C ou de la procédure Tcl&nbsp; qui est testée. Pour les tests &quot;en boîte noire&quot;, la cible&nbsp; &lt;target&gt; doit être le nom de la fonctionnalité testée.&nbsp; Des tests apparentés doivent avoir le même numéro majeur &lt;majorNum&gt;.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">L'argument &lt;description&gt; est une courte description textuelle du test, pour aider les personnes à comprendre ce qui est testé. Le nom de la fonction Tcl ou C devrait y être inclus pour les tests de régression. Si le cas de test est défini pour reproduire un bug, inclure l'identifiant (bugID) dans la description. </div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">L'argument optionnel &lt;constraints&gt; peut être une liste d'un ou plusieurs mots-clés ou une expression. Si l'argument &lt;constraints&gt; se compose de mots-clés, chacun d'entre eux doit être le nom d'un élément du tableau <i>::tcltest::testConstraints</i>.&nbsp; Si l'un de ces éléments est faux ou n'existe pas, le test est sauté. Si l'argument &lt;constraints&gt; est une expression, cette expression sera évaluée: si le résultat est vrai, alors le test sera éxécuté.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">Ajoutez des contraintes appropriées (par exemple, unixOnly) pour les tests qui ne doivent pas toujours être éxécutés. Par exemple, un test qui ne doit être effectué que sur Unix devrait ressembler à:</div>
<div ALIGN="LEFT" style="margin-left: 102px;">test getAttribute-1.1 &#123;testing file permissions} &#123;unixOnly} &#123;<br>
&nbsp;&nbsp;&nbsp; lindex &#91;file attributes foo.tcl] 5<br>
} &#123;00644}</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Exemple de test contenant une expression: </div>
<div ALIGN="LEFT" style="margin-left: 102px;">test unixNotfy-1.1 &#123;Tcl_DeleteFileHandler} &#123;unixOnly &amp;&amp; !testthread} &#123;<br>
&nbsp;&nbsp;&nbsp; catch &#123;vwait x}<br>
&nbsp;&nbsp;&nbsp; set f &#91;open foo w]<br>
&nbsp;&nbsp;&nbsp; fileevent &#36;f writable &#123;set x 1}<br>
&nbsp;&nbsp;&nbsp; vwait x<br>
&nbsp;&nbsp;&nbsp; close &#36;f<br>
&nbsp;&nbsp;&nbsp; list &#91;catch &#123;vwait x} msg] &#36;msg<br>
} &#123;1 &#123;ne peut pas attendre la variable &quot;x&quot;:&nbsp; attendrait indéfiniment }}<br>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Voir la section <i>&quot;Contraintes de Test&quot;</i> pour la liste des contraintes prédéfinies et pour savoir comment ajouter vos propres contraintes.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">L'argument &lt;script&gt; contient le script a exécuter pour effectuer le test. Il doit retourner un résultat dont la validité peut être vérifiée. Si votre script demande qu'un fichier soit créé à la volée, utilisez svp la procédure ::tcltest::makeFile. Si votre test demande qu'un petit fichier (moins de 50 lignes) soit contr&ocirc;lé en lecture, svp pensez à créer le fichier à la volée en utilisant la procédure ::tcltest::makeFile. Les fichiers créés par la procédure ::tcltest::makeFile seront automatiquement supprimés par la procédure ::tcltest::cleanupTests appelée à la fin de chaque fichier de test.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">L'argument &lt;expectedAnswer&gt; sera comparé au résultat de l'évaluation de l'argument &lt;script&gt;. S'ils correspondent, le test passe, sinon il échoue.</div>
<br>
<div><b>LES VARIABLES DU NAMESPACE TCLTEST</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Les variables suivantes sont définies dans le namespace tcltest et peuvent être utilisées par des tests:
<DL>
<DT><b>::tcltest::outputChannel</b></DT><DD>outputfileID - par défaut stdout, peut être précisé en indiquant -outfile sur la ligne de commande. Tout test qui imprime des résultats devrait envoyer cette sortie à <i>::tcltest::outputChannel</i> plut&ocirc;t que de sortir par défaut sur stdout.</DD>
<DT><br><b>::tcltest::errorChannel</b></DT><DD>errorfileID - par défaut stderr, peut être précisé en indiquant -errfile sur la ligne de commande. Tout test qui imprime des messages d'erreur devrait le faire vers <i>::tcltest::errorChannel </i>plut&ocirc;t que directement dans stderr.</DD>
<DT><br><b>::tcltest::mainThread</b></DT><DD>main thread ID - 1 par défaut. Ce sera le seul thread qui ne sera pas tué par ::tcltest::threadReap et qui sera assigné conformément à la valeur de retour de <i>testthread names</i> à l'initialisation.</DD>
<DT><br><b>::tcltest::originalEnv</b></DT><DD>copie du tableau global &quot;env&quot; au début de l'éxécution du test. Ce tableau est utilisé pour restaurer le tableau &quot;env&quot; à sa valeur initiale quand <i>::tcltest::cleanupTests</i>&nbsp; est appelée.</DD>
<DT><br><b>::tcltest::workingDirectory</b></DT><DD>le répertoire dans lequel le système de test a été lancé.</DD>
<DT><br><b>::tcltest::temporaryDirectory</b></DT><DD>le répertoire de sortie - par défaut <i>::tcltest::workingDirectory</i> , peut être précisé en indiquant&nbsp;&nbsp; -tmpdir en ligne de commande.</DD>
<DT><br><b>::tcltest::testsDirectory</b></DT><DD>là où; se trouvent les tests - par défaut&nbsp; <i>::tcltest::workingDirectory</i> , si le script ne peut pas déterminer où; le répertoire de tests se trouve. Il est possible de changer cette valeur par défaut en précisant -testdir en ligne de commande. Cette variable devrait toujours être précisée explicitement si les tests sont éxécutés depuis un fichier all.tcl.</DD>
<DT><br><b>::tcltest::tcltest</b></DT><DD>le nom de l'éxécutable utilisé pour appeler le système de test.</DD>
<DT><br><b>::tcltest::loadScript</b></DT><DD>Le script éxécuté en tant que <b>loadTestCommands</b>. Précisé par -load ou -loadfile. </DD>
</DL>
</div>
<br>
<div><b>CONTRAINTES DE TEST</b></div>
<br>
<div ALIGN="LEFT" style="margin-left: 51px;">Les contraintes sont utilisées pour déterminer si un test doit être ignoré.&nbsp; Chaque contrainte est stockée comme un indice du tableau <i>::tcltest::testConstraints</i>. Par exemple, la contrainte unixOnly est définie de la façon suivante: </div>
<div ALIGN="LEFT" style="margin-left: 101px;">set ::tcltest::testConstraints(unixOnly) \<br>
&nbsp;&nbsp;&nbsp; &#91;string equal &#36;tcl_platform(platform) &quot;unix&quot;]<br>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Si un test est contraint par &quot;unixOnly&quot;, il ne s'exécutera que si la valeur de ::tcltest::testConstraints(unixOnly) est vraie. Plusieurs contraintes sont définies dans le package <b>tcltest</b>.&nbsp; Pour ajouter des contraintes spécifiques à un fichier ou à un test, vous pouvez créer l'index correspondant du tableau ::tcltest::testsConstraints dans votre propre fichier de test.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">Voici la liste des contraintes définies dans le package <b>tcltest</b> :
<DL>
<DT><i>unix</i></DT><DD>le test ne peut s'exécuter que sur les plateformes UNIX</DD>
<DT><i>pc</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Windows</DD>
<DT><i>nt</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Windows NT</DD>
<DT><i>95</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Windows 95</DD>
<DT><i>98</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Windows 98</DD>
<DT><i>mac</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Mac</DD>
<DT><i>unixOrPc</i></DT><DD>le test ne peut s'exécuter que sur les plateformes UNIX ou PC</DD>
<DT><i>macOrPC</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Mac ou PC</DD>
<DT><i>macOrUnix</i></DT><DD>le test ne peut s'exécuter que sur les plateformes Mac ou Unix</DD>
<DT><i>tempNotPc</i></DT><DD>le test ne peut être éxécuté sur Windows. C'est un flag pour désactiver temporairement un test.</DD>
<DT><i>tempNotMac</i></DT><DD>le test ne peut être éxécuté sur un Mac. C'est un flag pour désactiver temporairement un test.</DD>
<DT><i>unixCrash</i></DT><DD>le test se plante s'il est éxécuté sur UNIX. C'est un flag pour désactiver temporairement un test.</DD>
<DT><i>pcCrash</i></DT><DD>le test se plante s'il est éxécuté sur PC. C'est un flag pour désactiver temporairement un test.</DD>
<DT><i>macCrash</i></DT><DD>le test se plante s'il est éxécuté sur Mac. C'est un flag pour désactiver temporairement un test.</DD>
<DT><i>emptyTest</i></DT><DD>le test est vide, et donc ne vaut pas la peine d'être éxécuté, mais il reste afin d'être écrit dans le futur. Cette contrainte provoque l'omission systématique du test.</DD>
<DT><i>knownBug</i></DT><DD>le test est connu pour se planter, et le bug n'est pas encore corrigé. Cette contrainte provoque l'omission du test., sauf si l'utilisateur demande le contraire. Voir la section &quot;Introduction&quot; pour plus d'informations.</DD>
<DT><i>nonPortable</i></DT><DD>ce test ne peut être effectué que dans l'environnement de développement Tcl/Tk maître. Certains tests sont par nature non portables, parce qu'ils dépendent de choses telles que la longueur de mot du processeur, la configuration du système de fichiers, le gestionnaire de fenêtres, etc. Ces tests sont seulement éxécutés dans l'environnement de développement Tcl principal, où; la configuration est bien connue. Cette contrainte provoque l'omission du test, sauf si l'utilisateur demande le contraire.</DD>
<DT><i>userInteraction</i></DT><DD>ce test demande une interaction avec l'utilisateur. Cette contrainte provoque l'omission du test, sauf si l'utilisateur demande le contraire.</DD>
<DT><i>interactive</i></DT><DD>ce test ne peut être effectué qu'en mode interactif, c'est à dire si la variable globale tcl_interactive est positionnée à 1.</DD>
<DT><i>nonBlockFiles</i></DT><DD>ce test ne peut s'exécuter que si la plateforme supporte de mettre les fichiers en mode non-bloqué.</DD>
<DT><i>asyncPipeClose</i></DT><DD>ce test ne peut s'exécuter que si la plateforme supporte &quot;async flush&quot; et &quot;async close&quot; sur un pipe.</DD>
<DT><i>unixExecs</i></DT><DD>le test ne peut s'exécuter que si la machine dispose des commandes telles que 'cat', 'echo', etc.</DD>
<DT><i>hasIsoLocale</i></DT><DD>le test ne peut s'exécuter que s'il peut passer dans une locale ISO.</DD>
<DT><i>root</i></DT><DD>le test ne peut s'exécuter que si l'utilisateur Unix est root</DD>
<DT><i>notRoot</i></DT><DD>le test ne peut s'exécuter que si l'utilisateur Unix n'est pas root</DD>
<DT><i>eformat</i></DT><DD>le test ne peut s'exécuter que si l'application a une version fonctionnelle de sprintf respectant le format &quot;e&quot; des nombres flottants.</DD>
<DT><i>stdio</i></DT><DD>le test ne peut s'exécuter que si l'application courante peut fonctionner au travers d'un pipe</DD>
</DL>
</div><br>
<div><b>FAIRE FONCTIONNER LES FICHIERS DE TEST</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Utiliser la commande suivante pour exécuter un fichier de test qui utilise le package tcltest:</div>
<div ALIGN="LEFT" style="margin-left: 101px;">&lt;shell&gt; &lt;testFile&gt; ?&lt;option&gt; ?&lt;value&gt;?? ...</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les options de ligne de commande sont les suivantes (les variables du namespace tcltest qui correspondent à chacune des options sont indiquées entre parenthèses à la fin de la description) :
<DL>
<DT><b>-help</b></DT><DD>affiche le mode d'utilisation</DD>
<DT><b>-verbose &lt;level&gt;</b></DT><DD>
définit le niveau de verbosité comme une sous-chaîne de &quot;bps&quot;. Voir la section &quot;Informations issus des tests&quot; pour une explication de cette option.&nbsp; (::tcltest::verbose)</DD>
<DT><b>-match &lt;matchList&gt;</b></DT><DD>
effectue seulement les tests qui correspondent aux motifs de &quot;glob&quot; définis dans &lt;matchList&gt;.&nbsp; (::tcltest::match)</DD>
<DT><b>-skip &lt;skipList&gt;</b></DT><DD>
n'effectue pas les tests qui correspondent à un ou plusieurs motifs de &quot;glob&quot; définis dans &lt;skipList&gt;.&nbsp; (::tcltest::skip) </DD>
<DT><b>-file &lt;globPatternList&gt;</b></DT><DD>
source seulement les fichiers de test dont les noms répondent à l'un des motifs de&nbsp; &lt;globPatternList&gt; définis par rapport au répertoire::tcltest::testsDirectory. Cette option n'a de sens qui si vous effectuez des tests utilisant &quot;all.tcl&quot; en tant que &lt;testFile&gt; au lieu d'effectuer directement des fichiers unitaires de test. (::tcltest::matchFiles) </DD>
<DT><b>-notfile &lt;globPatternList&gt;</b></DT><DD>
source tous les fichiers sauf ceux dont les noms répondent à l'un des motifs de &lt;globPatternList&gt; définis par rapport au répertoire::tcltest::testsDirectory.&nbsp;&nbsp; Cette option n'a de sens qui si vous effectuez des tests utilisant &quot;all.tcl&quot; en tant que &lt;testFile&gt; au lieu d'effectuer directement des fichiers unitaires de test. (::tcltest::skipFiles) </DD>
<DT><b>-constraints &lt;list&gt;</b></DT><DD>
les tests contenant une contrainte parmi la liste &lt;list&gt; ne seront pas sautés. Notez que les éléments de &lt;list&gt; doivent correspondrent exactement aux contraintes existantes. Ceci est utile si vous voulez avoir la certitude que les tests ayant une contrainte particulière sont effectués (par exemple, si le testeur souhaite que tous les tests contenant la contrainte knownBug soient effectués). (::tcltest::testConstraints(<i>constraintName</i>)) </DD>
<DT><b>-limitconstraints &lt;bool&gt;</b></DT><DD>Si l'argument de cette option est 1, les tests effectués seront ceux qui respectent les contraintes définies par l'option -constraints. La valeur par défaut de cet indicateur est 0 (false). Ceci est utile si vous voulez exécuter <b>seulement</b> les tests qui répondent aux contraintes listées par l'option -constraints. Un testeur peut vouloir cela par exemple pour n'effectuer que les tests contraints par unixOnly et aucun autre. (::tcltest::limitConstraints)</DD>
<DT><b>-load &lt;script&gt;</b></DT><DD>utilisera le script indiqué pour charger les commandes à tester (::tcltest::loadTestedCommands). La valeur par défaut est un script vide. Voir également -loadfile ci-dessous. (::tcltest::loadScript)</DD>
<DT><b>-loadfile &lt;scriptfile&gt;</b></DT><DD>utilisera le contenu du fichier indiqué pour charger les commandes à tester (::tcltest::loadTestedCommands).Voir également -load ci-dessus. La valeur par défaut est un script vide. (::tcltest::loadScript)</DD>
<DT><b>-tmpdir &lt;directoryName&gt;</b></DT><DD>mettra tous les fichiers temporaires (créés avec ::tcltest::makeFile et ::tcltest::makeDirectory) dans le répertoire indiqué.&nbsp; L'emplacement par défaut est ::tcltest::workingDirectory.&nbsp; (::tcltest::temporaryDirectory) </DD>
<DT><b>-testdir &lt;directoryName&gt;</b></DT><DD>cherche les tests à exécuter dans le répertoire indiqué. L'emplacement par défaut est ::tcltest::workingDirectory. (::tcltest::testsDirectory)</DD>
<DT><b>-preservecore &lt;level&gt;</b></DT><DD>contr&ocirc;le pour les fichiers core.&nbsp; Cette option détermine quel niveau de contr&ocirc;le sera effectué pour les fichiers &quot;core&quot;. La valeur par défaut pour &lt;level&gt; est 0. Les niveaux &lt;level&gt; sont définis comme suit :<DL>
<DT>0</DT><DD>Pas de contr&ocirc;le - ne pas contr&ocirc;ler les fichiers core à la fin de chaque test, mais les contr&ocirc;ler à chaque fois que::tcltest::cleanupTests est appelé depuis un fichier all.tcl. </DD>
<DT>1</DT><DD>Vérifier l'existence de fichiers core à la fin de chaque commande de test et à chaque fois que::tcltest::cleanupTests est appelé depuis un fichier all.tcl.</DD>
<DT>2</DT><DD>Vérifier l'existence de fichiers core à la fin de chaque commande de test et à chaque fois que::tcltest::cleanupTests est appelé depuis un fichier all.tcl. Sauvegarder tout fichier core produit dans ::tcltest::temporaryDirectory. (::tcltest::preserveCore)</DD>
</DL>
</DD>
<DT><b>-debug &lt;debugLevel&gt;</b></DT><DD>afficher l'information de debug dans stdout. Ceci est utilisé pour débugger le code du système de test. Le niveau de debug par défaut est 0. Les niveaux sont définis ainsi:<DL>
<DT>0</DT><DD>Ne pas afficher les informations de debug.</DD>
<DT>1</DT><DD>Afficher l'information indiquant si un test est sauté parce qu'il ne répond à aucune des conditions indiquées dans -match ou ::tcltest::match (userSpecifiedNonMatch), ou parce qu'il répond à une quelconque des conditions indiquées par -skip ou ::tcltest::skip ((userSpecifiedSkip).</DD>
<DT>2</DT><DD>Affiche le tableau des options interprété par le processeur de ligne de commande, le contenu du tableau ::env, et toutes les variables utilisateur définies dans le namespace courant, quand elles sont utilisées.</DD>
<DT>3</DT><DD>Affiche l'information concernant ce que font les procédures individuelles de le système de test.(::tcltest::debug)</DD>
</DL>
</DD>
<DT><b>-outfile &lt;filename&gt;</b></DT><DD>envoie la sortie générée par le package tcltest vers le fichier indiqué. La valeur par défaut est stdout. Notez que la sortie de debug va systématiquement dans stdout, quelque soit la valeur de cette option. (::tcltest::outputChannel)</DD>
<DT><b>-errfile &lt;filename&gt;</b></DT><DD>envoie les erreurs générées par le package tcltest vers le fichier indiqué. La valeur par défaut est stderr. (::tcltest::errorChannel)</DD>
</DL>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Une seconde façon d'exécuter les tests est de démarrer un shell, de charger le package <b>tcltest</b>, puis de sourcer un fichier de test approprié ou d'utiliser la commande test. Pour utiliser les options en mode interactif, alimenter la variable qui leur correspond dans le namespace tcltest après avoir chargé le package.</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Voir la section <i>&quot;Contraintes de Test&quot;</i> pour toutes les contraintes pré-construites qui peuvent être utilisées dans le tableau <b>::tcltest::testConstraints</b>. Voir la section <i>&quot;Les variables du </i><i>namespace Tcltest&quot;</i> pour des informations sur les autres variables définies dans le namespace tcltest.</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Une dernière façon d'exécuter les tests est d'indiquer les fichiers de test à exécuter à l'intérieur d'un fichier <i>all.tcl</i> (qui peut être nommé différemment). C'est l'approche utilisée par le système de test de Tcl. Ce fichier charge le package tcltest, définit l'emplacement du répertoire de test (::tcltest::testsDirectory), détermine quels fichiers de test exécuter, source chacun de ces fichiers, appelle ::tcltest::cleanupTests et finit de s'exécuter.</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Un fichier <i>all.tcl</i> plus élaboré peut faire du pré- et du post-processing avant de sourcer chaque fichier .test, utiliser des interpréteurs différents pour chaque fichier, ou manipuler des structures de répertoires complexes. Pour un exemple de fichier all.tcl, voir la section &quot;Exemples&quot; de ce document. </div>
<br><div><b>RESULTATS DES TESTS</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Après que tous les fichiers de test indiqués aient été éxécutés, le nombre de tests réussis, sautés ou échoués est envoyé dans<b>::tcltest::outputChannel</b>.&nbsp; A c&ocirc;té de cette information statistique, la sortie peut être pilotée pour chaque test par la variable <b>::tcltest::verbose</b>.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;"><b>::tcltest::verbose </b>peut avoir pour valeur n'importe quelle sous-chaîne ou permutation de &quot;bps&quot;.&nbsp;&nbsp; Dans la chaîne &quot;bps&quot;, le 'b' se réfère au corps (body) du test, le 'p' se réfère aux tests réussis&nbsp; (passed) et le 's' signifié tests sautés (skipped). La valeur par défaut de <b>::tcltest::verbose est &quot;b&quot;. </b>Si 'b' est présent, alors le corps entier du test est imprimé pour chaque test échoué;&nbsp; sinon seulement le nom du test, la sortie souhaitée et la sortie obtenue sont imprimés pour chaque test échoué. Si 'p' est présent, alors une ligne est imprimée pour chaque test réussi, sinon aucune ligne n'est imprimée pour les tests réussis. Si 's' est présent, alors une ligne (contenant les contraintes qui ont&nbsp; fait que le test a été sauté) est imprimée pour chaque test sauté, sinon aucune ligne n'est imprimée dans ce cas.</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez positionner <b>::tcltest::verbose</b>, soit interactivement (une fois que le package <b>tcltest</b> a été chargé) ou en utilisant l'argument de ligne de commande -verbose, par exemple:</div>
<div ALIGN="LEFT" style="margin-left: 51px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tclsh socket.test -verbose bps</div>
<br>
<div><b>CONTENUS D'UN FICHIER DE TEST</b></div>
<br>
<div ALIGN="LEFT" style="margin-left: 51px;">Les fichiers de test doivent commencer par charger le package <b>tcltest</b>: </div>
<div ALIGN="LEFT" style="margin-left: 102px;">if &#123;&#91;lsearch &#91;namespace children] ::tcltest] == -1} &#123;<br>
&nbsp;&nbsp;&nbsp; package require tcltest<br>
&nbsp;&nbsp;&nbsp; namespace import ::tcltest::*<br>
}<br>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les fichiers de tests doivent se terminer par l'appel de la fonction de nettoyage <b>::tcltest::cleanupTests</b>. La procédure <b>::tcltest::cleanupTests </b>affiche des statistiques au sujet du nombre de tests réussis, sautés ou échoués,&nbsp; et supprime tous les fichiers créés au moyen des procédures<b> ::tcltest::makeFile</b> et <b>::tcltest::makeDirectory</b>.<b> </b></div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 102px;"># Supprime les fichiers créés par ces tests </div>
<div ALIGN="LEFT" style="margin-left: 102px;"># Retour au répertoire de travail initial<br>
# Supprime les tableaux globaux<br>
::tcltest::cleanupTests<br>
return<br>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les fichiers de tests doivent se finir par une extension .test. Les noms des fichiers de tests qui contiennent des tests de régression (dits de boîte transparente) doivent être nommés d'après les fichiers de code Tcl ou C qu'ils testent. Par exemple, le fichier de test du programme C &quot;tclCmdAH.c&quot; doit être &quot;cmdAH.test&quot;. Les fichiers qui contiennent des tests &quot;boîte noire&quot; (black-box tests) devraient se conformer au motif &quot;*_bb.test&quot;.</div>
<div ALIGN="LEFT" style="margin-left: 51px;"> </div><br>
<div><b>SELECTIONNER DES TESTS A EXECUTER DANS UN FICHIER</b></div><br>
<div ALIGN="LEFT" style="margin-left: 51px;">Normalement, quand un fichier est sourcé, tous les tests qu'il contient sont éxécutés. Individuellement, un test sera sauté si l'une des conditions suivantes est vraie:
<DL>
<DT>&#91;1]</DT><DD>le <i>nom</i> du test ne correspond pas (en utilisant la correspondance de type &quot;glob&quot;) à un ou plusieurs éléments de la variable <b>::tcltest::match</b>.</DD>
<DT>&#91;2]</DT><DD>le <i>nom</i> du test correspond (en utilisant la correspondance de type &quot;glob&quot;) à un ou plusieurs éléments de la variable <b>::tcltest::skip</b>.</DD>
<DT>&#91;3]</DT><DD>l'argument <i>constraints</i> de l'appel à <b>::tcltest::call</b>, s'il existe, contient une ou plusieurs valeurs fausses.</DD>
</DL>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez définir <b>::tcltest::match </b>et/ou<b> ::tcltest::skip, </b>soit interactivement (après que le package<b> tcltest </b>a été sourcé), ou en utilisant les arguments de ligne de commande<b> -match </b>et<b> </b><b>-skip</b>, par exemple <b>:&nbsp;&nbsp; </b> </div>
<div ALIGN="LEFT" style="margin-left: 102px;">tclsh info.test -match '*-5.* *-7.*' -skip '*-7.1*'</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Soyez s&ucirc;r de bien placer les quotes, de façon que votre shell ne fasse pas les substitutions de type glob sur les motifs que vous indiquez&nbsp; (que ce soit bien l'interpréteur tcl qui fasse ces substitutions).&nbsp; </div>
<div ALIGN="LEFT" style="margin-left: 51px;">Les contraintes prédéfinies (par exemple <i>knownBug</i> et <i>nonPortable</i>) peuvent être changées soit interactivement (après que le package<b> tcltest </b>a été sourcé), en définissant la variable <b>::tcltest::testConstraints</b>(<i>constraint</i>), ou en utilisant l'option de ligne de commande <b>-constraints</b> avec le nom de la contrainte comme argument. L'exemple suivant montre comment faire fonctionner des tests contraints par les restrictsions <i>knownBug</i> et <i>nonPortable</i>: </div>
<div ALIGN="LEFT" style="margin-left: 51px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tclsh all.tcl -constraints &quot;knownBug nonPortable&quot;</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Voir la section <i>&quot;Contraintes de Test&quot;</i> pour plus d' information sur l'utilisation des contraintes prédéfinies et l'ajout de nouvelles contraintes. </div>
<br>
<div><b>PERSONNALISER LE SYSTEME DE TEST</b></div>
<br>
<div ALIGN="LEFT" style="margin-left: 51px;">Pour créer votre propre système de test, créer un fichier .tcl qui contient votre namespace. Dans ce fichier, appeller le package <b>tcltest</b> <i>(package require tcltest)</i>. Les commandes qui peuvent être redéfinies pour personnaliser le système de test sont:
<DL>
<DT><b>::tcltest::PrintUsageInfoHook</b></DT><DD>afficher de l'information complémentaire, spécifique à votre situation.</DD>
<DT><b>::tcltest::processCmdLineArgsFlagHook</b></DT><DD>avertir le système au sujet d'options additionnelles que vous voulez qu'il comprenne.</DD>
<DT><b>::tcltest::processCmdLineArgsHook</b> <i>flags</i></DT><DD>traiter les options additionnelles que vous avez communiquées au système de test au travers de ::tcltest::processCmdLineArgsFlagHook.</DD>
<DT><b>::tcltest::initConstraintsHook</b></DT><DD>ajouter des contraintes additionnelles aux contraintes prédéfinies par <b>tcltest</b>.</DD>
<DT><b>::tcltest::cleanupTestsHook</b></DT><DD>faire du nettoyage additionnel</DD>
</DL>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Pour ajouter de nouvelles options à votre système de test personnalisé, redéfinissez <b>::tcltest::processCmdLineArgsAddFlagHook</b> pour la liste des options additionnelles à interpréter, et <b>::tcltest::processCmdLineArgsHook</b> pour les traiter effectivement . Par exemple: </div>
<div ALIGN="LEFT" style="margin-left: 102px;">proc ::tcltest::processCmdLineArgsAddFlagHook &#123;} &#123;<br>
&nbsp;&nbsp;&nbsp; return &#91;list -flag1 -flag2]<br>
}<br>
<br>
proc ::tcltest::processCmdLineArgsHook &#123;flagArray} &#123;<br>
&nbsp;&nbsp;&nbsp; array set flag &#36;flagArray<br>
<br>
&nbsp;&nbsp;&nbsp; if &#123;&#91;info exists flag(-flag1)]} &#123;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Handle flag1<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; if &#123;&#91;info exists flag(-flag2)]} &#123;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Handle flag2<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; return<br>
}<br>
</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">Vous pouvez aussi vouloir ajouter un mode d'emploi pour ces options.&nbsp; Ce mode d'emploi s'affichera quand l'utilisateur indiquera -help. Pour définir le mode d'emploi additionnel, définissez votre propre procédure ::tcltest::PrintUsageInfoHook. A l'intérieur de cette procédure, vous afficherez le mode d'emploi complémentaire pour chacune des options que vous avez ajoutées.</div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 51px;">Pour ajouter de nouvelles contraintes prédéfinies au système de test, définissez votre propre version de <b>::tcltest::initConstraintsHook</b>.&nbsp; A l'intérieur de cette procédure, vous pouvez compléter le tableau <b>::tcltest::testConstraints</b>. Par exemple: </div>
<div ALIGN="LEFT" style="margin-left: 102px;">proc ::tcltest::initConstraintsHook &#123;} &#123;<br>
&nbsp;&nbsp;&nbsp; set ::tcltest::testConstraints(win95Or98) \<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#91;expr &#123;&#36;::tcltest::testConstraints(95) || \<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#36;::tcltest::testConstraints(98)}]<br>
}<br>
</div>
<div ALIGN="LEFT" style="margin-left: 51px;">Enfin, si vous voulez ajouter du code de nettoyage complémentaire, vous pouvez définir votre propre <b>::tcltest::cleanupTestsHook</b>.&nbsp; Par exemple: </div>
<div ALIGN="LEFT" style="margin-left: 102px;">proc ::tcltest::cleanupTestsHook &#123;} &#123;<br>
&nbsp;&nbsp;&nbsp; # Add your cleanup code here<br>
}<br>
</div>
<div><b>EXEMPLES</b></div>
<div>&nbsp;
<div ALIGN="LEFT" style="margin-left: 102px;">&#91;1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Un fichier de test simple (foo.test) </div>
<div ALIGN="LEFT" style="margin-left: 102px;">if &#123;&#91;lsearch &#91;namespace children] ::tcltest] == -1} &#123;<br>
&nbsp;&nbsp;&nbsp; package require tcltest<br>
&nbsp;&nbsp;&nbsp; namespace import ::tcltest::*<br>
}<br>
<br>
test foo-1.1 &#123;enregistrer 1 dans la variable foo} &#123;} &#123;<br>
&nbsp;&nbsp;&nbsp; set foo 1<br>
} &#123;1}<br>
<br>
::tcltest::cleanupTests<br>
return<br>
</div>
<div ALIGN="LEFT" style="margin-left: 102px;">&#91;2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Un fichier all.tcl simple </div>
<div ALIGN="LEFT" style="margin-left: 102px;">if &#123;&#91;lsearch &#91;namespace children] ::tcltest] == -1} &#123;<br>
&nbsp;&nbsp;&nbsp; package require tcltest<br>
&nbsp;&nbsp;&nbsp; namespace import ::tcltest::*<br>
}<br>
<br>
set ::tcltest::testSingleFile false<br>
set ::tcltest::testsDirectory &#91;file dir &#91;info script]]<br>
<br>
foreach file &#91;::tcltest::getMatchingTestFiles] &#123;<br>
&nbsp;&nbsp;&nbsp; if &#123;&#91;catch &#123;source &#36;file} msg]} &#123;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts stdout &#36;msg<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
::tclttest::cleanupTests 1<br>
return<br>
</div>
<div ALIGN="LEFT" style="margin-left: 102px;">&#91;3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exécuter un test simple </div>
<div ALIGN="LEFT" style="margin-left: 102px;">tclsh foo.test<br>
</div>
<div ALIGN="LEFT" style="margin-left: 102px;">&#91;4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exécuter des tests multiples </div>
<div ALIGN="LEFT" style="margin-left: 102px;">tclsh all.tcl -file 'foo*.test' -notfile 'foo2.test'<br>
</div>
<div>&nbsp;
<div>Dernière révision: 8.2</div>
</BODY></HTML>