index.html.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 573 行 · 第 1/2 页
SVN-BASE
573 行
il suffit de marquer vos classes de base comme <span class="new_code">abstract</span>. SimpleTest ne lance pas les classes abstraites. Et si vous utilisez encore PHP4 alors une directive <span class="new_code">SimpleTestOptions::ignore()</span> dans votre fichier de sc茅nario de test aura le m锚me effet. </p> <p> Par ailleurs, le fichier avec le sc茅nario de test ne devrait pas avoir 茅t茅 inclus ailleurs. Sinon aucun sc茅nario de test ne sera inclus 脿 ce groupe. Ceci pourrait se transformer en un probl猫me plus grave : si des fichiers ont d茅j脿 茅t茅 inclus par PHP alors la m茅thode <span class="new_code">TestSuite::addFile()</span> ne les d茅tectera pas. </p> <p> Pour afficher les r茅sultats, il est seulement n茅cessaire d'invoquer <em>tests/all_tests.php</em> 脿 partir du serveur web. </p> <p> Pour plus de renseignements des groupes de tests, voyez le <a href="group_test_documentation.html">documentation sur le groupement des tests</a>. </p> <p><a class="target" name="mock"><h2>Utiliser les objets fantaisie</h2></a></p> <p> Avan莽ons un peu plus dans le futur. </p> <p> Supposons que notre class logging soit test茅e et termin茅e. Supposons aussi que nous testons une autre classe qui ait besoin d'茅crire des messages de log, disons <span class="new_code">SessionPool</span>. Nous voulons tester une m茅thode qui ressemblera probablement 脿 quelque chose comme...<pre><strong>class SessionPool { ... function logIn($username) { ... $this->_log->message('User $username logged in.'); ... } ...}</strong></pre> Avec le concept de "r茅utilisation de code" comme fil conducteur, nous utilisons notre class <span class="new_code">Log</span>. Un sc茅nario de test classique ressemblera peut-锚tre 脿...<pre><?phprequire_once('simpletest/autorun.php');require_once('../classes/log.php');<strong>require_once('../classes/session_pool.php');</strong>class <strong>TestOfSessionLogging</strong> extends UnitTestCase { function setUp() { <strong>@unlink('/temp/test.log');</strong> } function tearDown() { <strong>@unlink('/temp/test.log');</strong> } function testLoggingInIsLogged() { <strong>$log = new Log('/temp/test.log'); $session_pool = &new SessionPool($log); $session_pool->logIn('fred');</strong> $messages = file('/temp/test.log'); $this->assertEqual($messages[0], "User fred logged in.<strong>\n</strong>"); }}?></pre> Nous expliquerons les m茅thodes <span class="new_code">setUp()</span> et <span class="new_code">tearDown()</span> plus tard. </p> <p> Le design de ce sc茅nario de test n'est pas compl猫tement mauvais, mais on peut l'am茅liorer. Nous passons du temps 脿 tripoter les fichiers de log qui ne font pas partie de notre test. Pire, nous avons cr茅茅 des liens de proximit茅 entre la classe <span class="new_code">Log</span> et ce test. Que se passerait-il si nous n'utilisions plus de fichiers, mais la biblioth猫que <em>syslog</em> 脿 la place ? Cela veut dire que notre test <span class="new_code">TestOfSessionLogging</span> enverra un 茅chec alors m锚me qu'il ne teste pas Logging. </p> <p> Il est aussi fragile sur des petites retouches. Avez-vous remarqu茅 le retour chariot suppl茅mentaire 脿 la fin du message ? A-t-il 茅t茅 ajout茅 par le loggueur ? Et si il ajoutait aussi un timestamp ou d'autres donn茅es ? </p> <p> L'unique partie 脿 tester r茅ellement est l'envoi d'un message pr茅cis au loggueur. Nous pouvons r茅duire le couplage en cr茅ant une fausse classe de logging : elle ne fait qu'enregistrer le message pour le test, mais ne produit aucun r茅sultat. Sauf qu'elle doit ressembler exactement 脿 l'original. </p> <p> Si l'objet fantaisie n'茅crit pas dans un fichier alors nous nous 茅pargnons la suppression du fichier avant et apr猫s le test. Nous pourrions m锚me nous 茅pargner quelques lignes de code suppl茅mentaires si l'objet fantaisie pouvait ex茅cuter l'assertion. <p> </p> Trop beau pour 锚tre vrai ? Pas vraiement on peut cr茅er un tel objet tr猫s facilement...<pre><?phprequire_once('simpletest/autorun.php');require_once('../classes/log.php');require_once('../classes/session_pool.php');<strong>Mock::generate('Log');</strong>class TestOfSessionLogging extends UnitTestCase { function testLoggingInIsLogged() {<strong> $log = &new MockLog(); $log->expectOnce('message', array('User fred logged in.'));</strong> $session_pool = &new SessionPool(<strong>$log</strong>); $session_pool->logIn('fred'); }}?></pre> L'appel <span class="new_code">Mock::generate()</span> a g茅n茅r茅 une nouvelle classe appel茅 <span class="new_code">MockLog</span>. Cela ressemble 脿 un clone identique, sauf que nous pouvons y adjoindre du code de test. C'est ce que fait <span class="new_code">expectOnce()</span>. Cela dit que si <span class="new_code">message()</span> m'est appel茅, il a int茅r锚t 脿 l'锚tre avec le param猫tre "User fred logged in.". </p> <p> L'appel <span class="new_code">tally()</span> est n茅cessaire pour annoncer 脿 l'objet fantaisie qu'il n'y aura plus d'appels ult茅rieurs. Sans 莽a l'objet fantaisie pourrait attendre pendant une 茅ternit茅 l'appel de la m茅thode sans jamais pr茅venir le sc茅nario de test. Les autres tests sont d茅clench茅s automatiquement quand l'appel 脿 <span class="new_code">message()</span> est invoqu茅 sur l'objet <span class="new_code">MockLog</span> par le code <span class="new_code">SessionPool::logIn()</span>. L'appel <span class="new_code">mock</span> va d茅clencher une comparaison des param猫tres et ensuite envoyer le message "pass" ou "fail" au test pour l'affichage. Des jokers peuvent 锚tre inclus pour ne pas avoir 脿 tester tous les param猫tres d'un appel alors que vous ne souhaitez qu'en tester un. </p> <p> Les objets fantaisie dans la suite SimpleTest peuvent avoir un ensemble de valeurs de sortie arbitraires, des s茅quences de sorties, des valeurs de sortie s茅lectionn茅es 脿 partir des arguments d'entr茅e, des s茅quences de param猫tres attendus et des limites sur le nombre de fois qu'une m茅thode peut 锚tre invoqu茅e. </p> <p> Pour que ce test fonctionne la librairie avec les objets fantaisie doit 锚tre incluse dans la suite de tests, par exemple dans <em>all_tests.php</em>. </p> <p> Pour plus de renseignements sur les objets fantaisie, voyez le <a href="mock_objects_documentation.html">documentation sur les objets fantaisie</a>. </p> <p><a class="target" name="web"><h2>Tester une page web</h2></a></p> <p> Une des exigences des sites web, c'est qu'ils produisent des pages web. Si vous construisez un projet de A 脿 Z et que vous voulez int茅grer des tests au fur et 脿 mesure alors vous voulez un outil qui puisse effectuer une navigation automatique et en examiner le r茅sultat. C'est le boulot d'un testeur web. </p> <p> Effectuer un test web via SimpleTest reste assez primitif : il n'y a pas de javascript par exemple. La plupart des autres op茅rations d'un navigateur sont simul茅es. </p> <p> Pour vous donner une id茅e, voici un exemple assez trivial : aller chercher une page web, 脿 partir de l脿 naviguer vers la page "about" et finalement tester un contenu d茅termin茅 par le client.<pre><?phprequire_once('simpletest/autorun.php');<strong>require_once('simpletest/web_tester.php');</strong>class TestOfAbout extends <strong>WebTestCase</strong> { function testOurAboutPageGivesFreeReignToOurEgo() { <strong>$this->get('http://test-server/index.php'); $this->click('About'); $this->assertTitle('About why we are so great'); $this->assertText('We are really great');</strong> }}?></pre> Avec ce code comme test de recette, vous pouvez vous assurer que le contenu corresponde toujours aux sp茅cifications 脿 la fois des d茅veloppeurs et des autres parties prenantes au projet. </p> <p> Vous pouvez aussi naviguer 脿 travers des formulaires...<pre><?phprequire_once('simpletest/autorun.php');require_once('simpletest/web_tester.php');class TestOfRankings extends WebTestCase { function testWeAreTopOfGoogle() { $this->get('http://google.com/'); $this->setField('q', 'simpletest'); $this->click("I'm Feeling Lucky"); $this->assertTitle('SimpleTest - Unit Testing for PHP'); }}?></pre> ...m锚me si cela pourrait constituer une violation des documents juridiques de Google(tm). </p> <p> Pour plus de renseignements sur comment tester une page web, voyez la <a href="web_tester_documentation.html">documentation sur tester des scripts web</a>. </p> <p> <a href="http://sourceforge.net/projects/simpletest/"><img src="http://sourceforge.net/sflogo.php?group_id=76550&type=5" width="210" height="62" border="0" alt="SourceForge.net Logo"></a> </p> </div> References and related information... <ul><li> <a href="https://sourceforge.net/project/showfiles.php?group_id=76550&release_id=153280">T茅l茅charger PHP Simple Test</a> depuis <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>. </li><li> L'<a href="http://simpletest.org/api/">API de SimpleTest pour d茅veloppeur</a> donne tous les d茅tails sur les classes et assertions existantes. </li></ul><div class="menu_back"><div class="menu"><a href="index.html">SimpleTest</a> | <a href="overview.html">Overview</a> | <a href="unit_test_documentation.html">Unit tester</a> | <a href="group_test_documentation.html">Group tests</a> | <a href="mock_objects_documentation.html">Mock objects</a> | <a href="partial_mocks_documentation.html">Partial mocks</a> | <a href="reporter_documentation.html">Reporting</a> | <a href="expectation_documentation.html">Expectations</a> | <a href="web_tester_documentation.html">Web tester</a> | <a href="form_testing_documentation.html">Testing forms</a> | <a href="authentication_documentation.html">Authentication</a> | <a href="browser_documentation.html">Scriptable browser</a></div></div><div class="copyright"> Copyright<br>Marcus Baker 2006 </div></body></html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?