J'avais en effet l'assertion suivante :
<?php
class progressBar extends atoum\test
{
...
$this->assert
->object($progressBar->update('F'))
->isIdenticalTo($progressBar)
->string((string) $progressBar)
->isEqualTo(str_repeat("\010", $length - 1) . 'F' . str_repeat('_', 59) . '][1/1]')
;
...
}
?>
Rien de bien extraordinaire, et pourtant j'ai eu un problème.
En effet, comme de juste lorsque l'on fait du TDD, la première fois que j'ai exécuté mon test, il n'est pas passé.
Sauf que le rapport d'exécution ne ressemblait pas du tout à ce qu'il aurait dut être.
J'ai en effet obtenu cela :
Failure ! (2 tests, 20 assertions, 1 failure)
There is 1 failure:
mageekguy\atoum\tests\units\reporters\cli\progressBar::testUpdate():
mageekguy\atoum\asserters\string::isEqualTo() failed because string(67) 'laStringQueJeVeuxAvecDes\010' in
file /usr/home/fch/atoum/tests/units/reporters/cli/progressBar.php at line 101
Au lieu de cela :
Failure ! (2 tests, 20 assertions, 1 failure)
There is 1 failure:
mageekguy\atoum\tests\units\reporters\cli\progressBar::testUpdate():
mageekguy\atoum\asserters\string::isEqualTo() failed because string(196) 'laStringTestee' is not equal to string(198) 'laStringQueJeVeuxAvecDes\010' in file /usr/home/fch/atoum/tests/units
/reporters/cli/progressBar.php at line 101
En résumé, une grande partie du rapport est effacée...
Connaissant parfaitement, et pour cause, mon code, je n'ai pas eu de mal à trouver l'origine de mon problème.
En effet, ma barre de progression fait appel au caractère de contrôle \010
aka Backspace
pour mettre à jour son affichage.
Et si son utilisation ne pose aucun problème lors de la vérification de l'assertion, elle en pose lorsqu'il est affiché dans le rapport d’exécution puisqu'il provoque son effacement.
Il me fallait donc faire en sorte d'annuler le comportement de \010
dans mes chaînes de caractères à l'affichage pour supprimer ce comportement.
Et la solution est simple, puisque PHP dispose d'une fonction addcslashes()
dont c'est justement le rôle :
<?php
class progressBar extends atoum\test
{
...
$this->assert
->object($progressBar->update('F'))
->isIdenticalTo($progressBar)
->string(addcslashes((string) $progressBar), "\010")
->isEqualTo(addcslashes(str_repeat("\010", $length - 1) . 'F' . str_repeat('_', 59) . '][1/1]'), "\010")
;
...
}
?>
J'obtiens ainsi un rapport d'exécution beaucoup plus lisible, puisque tout les caractère \010
sont transformés par addcslashes()
en \b
, ce qui n'a aucune influence lors de l'affichage.
Évidement, la solution, telle qu'elle est mise en œuvre ci-dessus est plus un hack
qu'autre chose, mais je compte bien profiter du système d'assertion modulaire d'Atoum pour l'intégrer avec beaucoup plus d'élégance
5 réactions
1 De desfrenes - 08/09/2010, 11:34
Et atoum, c'est toujours privé pour l'instant ?
@+
2 De mageekguy - 08/09/2010, 14:43
@desfrenes : Pour l'instant, oui.
L'essentiel est fonctionnel, mais il y a encore beaucoup de choses à finaliser.
J'espère diffuser une béta au début du mois prochain, mais je manque de temps et ce n'est pas parti pour s'arranger.
Gauthier Delamarre m'a déjà proposé son aide pour faire avancer les choses plus vites, si tu veux en faire autant, tu es le bienvenu.
3 De desfrenes - 08/09/2010, 16:56
Je ne pratique pas (encore) le TDD mais j'y viens, je suis donc mal placé pour apporter une aide à la conception. En revanche je peux tester (!). Je suis à la recherche d'une alternative à PHPUnit qui soit "optimisée" pour les versions récentes de PHP (namespaces, etc...).
4 De Ivan Enderlin - 08/09/2010, 18:13
Hey :-),
Il me faudrait ton mail pour qu'on parle d'Atoum. J'ai un projet de recherche très intéressant et très avancé sur les tests unitaires dans PHP.
Merci :-).
5 De mageekguy - 08/09/2010, 18:20
@Ivan Enderlin : Tu n'as pas cherché beaucoup, il est dans mon CV ;).