Changer l'affichage du test
Le composant affichage de SimpleTest est en fait la dernière partie à développer. Des morceaux de la section suivante changeront prochainement et -- avec optimisme -- des composants d'affichage plus sophistiqués seront écrits, mais pour l'instant si un affichage minime n'est pas suffisant, voici comment réaliser le votre.
Je veux voir les succès !
Bon d'accord, voici comment.
Nous devons créer une sous-classe de l'affichage utilisée,
dans notre cas il s'agit de HtmlReporter
.
La classe HtmlReporter
est situé dans le fichier
simpletest/reporter.php :
pour l'instant elle a l'interface suivante...
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 { ... } }Voici ce que les méthodes pertinentes veulent dire. Vous pouvez consulter la liste complète ici si cela vous intéresse.
-
HtmlReporter()
est le constructeur. Notez qu'un test unitaire initie le lien vers l'affichage plutôt que l'inverse. L'affichage est un réceptacle passif des évènements de test. Cela permet une adaptation facile de l'affichage pour d'autres systèmes 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. -
void paintFail(string $message)
peint un échec. Voir ci-dessous. -
void paintPass(string \$message)
ne fait rien par défaut. C'est cette méthode que nous allons modifier. -
string _getCss()
renvoie le style CSS - via une chaîne - pour la méthode d'entête de la page. Des styles complémentaires peuvent être ajoutés ici. -
array getTestList()
est une méthode commode pour des sous-classes. Elle liste l'emboîtement courant des tests via une liste de noms de test. Le premier, le test emboîté le plus profondément, est le premier dans la liste et la méthode du test courant sera la dernière.
Pour afficher les succès nous avons juste
besoin que la méthode paintPass()
se comporte comme paintFail()
.
Bien sûr nous n'allons pas modifier l'original.
Nous allons juste créer une sous-classe.
Une sous-classe d'affichage
Premièrement nous allons créer un fichier tests/show_passes.php dans notre projet de log et y placer cette classe vide...
<?php if (! defined('SIMPLE_TEST')) { define('SIMPLE_TEST', 'simpletest/'); } require_once(SIMPLE_TEST . 'reporter.php'); class ShowPasses extends HtmlReporter { function ShowPasses() { $this->HtmlReporter(); } } ?>Une rapide mais attentive lecture du code de SimpleTest indique que l'implémentation de
paintFail()
ressemble à...
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"; }Essentiellement elle s'enchaîne à la version du parent, que nous devons aussi réaliser pour garantir le ménage, et ensuite imprime une trace calculée à 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...
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"; } }Pour l'instant tout roule. Maintenant pour utiliser notre nouvelle classe, nous allons modifier notre fichier tests/all_tests.php...
<?php if (! defined('SIMPLE_TEST')) { define('SIMPLE_TEST', 'simpletest/'); } require_once(SIMPLE_TEST . 'unit_tester.php'); require_once('show_passes.php'); $test = &new GroupTest('All tests'); $test->addTestFile('log_test.php'); $test->addTestFile('clock_test.php'); $test->run(new ShowPasses()); ?>Nous pouvons le lancer pour voir le résultat de notre bricolage...
All tests
Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 1/] in [Test line 1]Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 2/] in [Test line 2]
Pass: log_test.php->Log class test->testcreatingnewfile->Created before message
Pass: log_test.php->Log class test->testcreatingnewfile->File created
Pass: clock_test.php->Clock class test->testclockadvance->Advancement
Pass: clock_test.php->Clock class test->testclocktellstime->Now is the right time
span.pass
n'est pas stylé en CSS,
mais nous pouvons l'ajouter en modifiant une autre méthode...
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"; } function _getCss() { return parent::_getCss() . ' .pass { color: green; }'; } }Si vous ajoutez le code au fur et à mesure, vous verrez l'ajout du style dans le code source du résultat via le navigateur. A l'oeil, l'affichage devrait ressembler à...
All tests
Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 1/] in [Test line 1]Pass: log_test.php->Log class test->testappendingtofile->Expecting [/Test line 2/] in [Test line 2]
Pass: log_test.php->Log class test->testcreatingnewfile->Created before message
Pass: log_test.php->Log class test->testcreatingnewfile->File created
Pass: clock_test.php->Clock class test->testclockadvance->Advancement
Pass: clock_test.php->Clock class test->testclocktellstime->Now is the right time
Essayez les deux méthodes pour déterminer votre préférence. Nous allons le laisser tel que pour l'étape qui approche : les objets fantaisie. 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.