Changer l'affichage du test

SimpleTest est fourni avec un composant affichage ultra-simple. La plupart du temps vous souhaitez juste savoir si votre test passe. Et s'il ne passe pas, c'est la raison qui est importante. Rien de plus.

Parfois vous aurez besoin d'une sortie pluse sophistiquée parfois pour un boss, un responsable ou un tiers, parfois pour les tests de recette. Si un affichage minime n'est pas suffisant, voici comment réaliser le votre.

Je veux voir les succès !

Vous voulez vraiment afficher les succès ? Alors 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 __construct() { ... }
    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.

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
    require_once('simpletest/reporter.php');
    
    class ShowPasses extends 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 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
require_once('show_passes.php');
require_once('simpletest/simpletest.php');
SimpleTest::prefer(new ShowPasses());
require_once('simpletest/autorun.php');

class AllTests extends TestSuite {
    function __construct() {
        parent::__construct('All tests');
        $this->addFile(dirname(__FILE__).'/log_test.php');
        $this->addFile(dirname(__FILE__).'/clock_test.php');
    }
}
?>

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
3/3 test cases complete. 6 passes and 0 fails.
Joli, mais pas encore digne d'une médaille d'or. Nous avons perdu un peu d'information au passage. L'affichage du span.pass n'est pas stylé en CSS, mais nous pouvons l'ajouter en modifiant une autre méthode...

class ShowPasses extends 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";
    }
    
    protected 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
3/3 test cases complete. 6 passes and 0 fails.
Certains préfèrent voir les succès quand ils travaillent sur le code; le sentiment de travail achevé est sympathique après tout. Une fois que vous commencez à naviguer de haut en bas pour trouver les erreurs, assez vite vous en comprendrez le côté obscur.

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.

La section précédente : sous-classer les scénarios de test
Cette section est très spécifique à SimpleTest. Si vous utilisez un autre outil, n'hésitez pas à sauter pardessus.
Mais vous pouvez aussi aller jusqu'au objets fantaisie.