Created
August 21, 2012 14:29
-
-
Save ludofleury/3416015 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[15:46] == Ludof [513967f0@gateway/web/freenode/ip.81.57.103.240] has joined ##atoum | |
[15:46] -ChanServ- [##atoum] Welcome on channel of atoum, the simple, modern and intuitive unit test framework for PHP 5.3+ ! | |
[15:46] <Ludof> Hello les gens | |
[15:46] <Ludof> si y'a du atoum boyz dans la salle, j'voudrais rapidement comprendre le coup du if(),and(),then() sur atoum, c'est le truc que j'ai pas suivi. | |
[15:46] == jubianchi[work] [~ABC-OBJEC@92.103.14.114] has quit [Read error: No route to host] | |
[15:47] <Ludof> genre typiquement: https://github.com/mageekguy/atoum/pull/108/files | |
[15:47] == jubianchi[work] [~ABC-OBJEC@92.103.14.114] has joined ##atoum | |
[16:07] <steph_py> Yop Ludof | |
[16:07] <steph_py> J'ai pas trop touché à cette fonctionnalité | |
[16:07] <steph_py> mais visiblement ça permet d'initialiser le contexte | |
[16:08] <steph_py> ou peut-être qu'il y a une autre utilité, mais à part peut-être la lisibilité, jsais pas | |
[16:08] <Ludof> pour moi c'est des précondition d'environnement, mais je suis pas certain. | |
[16:10] <steph_py> Ouaip, je pense aussi | |
[16:10] <mageekguy> c'est juste une convention d'écriture | |
[16:11] <mageekguy> de la décoration | |
[16:11] <mageekguy> if() et autres ne font strictement rien | |
[16:11] <mageekguy> c'est juste une façon d'ajouter de la sémantique aux tests | |
[16:11] <mageekguy> de la même façon que behat | |
[16:12] <Ludof> oh... | |
[16:12] <Ludof> j'ai du mal à voir l'intêret à par rendre le test un peu plus verbeux (certes peut être plus sémantique). | |
[16:12] <Ludof> j'essayerai de tester | |
[16:12] <mageekguy> tout le monde voit midi à sa porte | |
[16:13] <mageekguy> ce n'est pas du tout obligatoire d'écrire ses tests de cette façon | |
[16:13] <mageekguy> c'est juste une façon parmi d'autre | |
[16:13] <Ludof> ok, je vois mieux. | |
[16:13] <mageekguy> il y a pour l'instant une exception au fait que ces "mots-clefs" soient juste de la décoration, c'est "assert" | |
[16:13] <Ludof> donc si j'ai bien compris, tu écris tes "pré-condition" de test sous cette forme | |
[16:13] <Ludof> et tu test la sortie | |
[16:14] <Ludof> ok, ça ajoute la semantique | |
[16:14] <mageekguy> si j'ai ça et ça et encore ça, alors je dois obtenir ceci, ceci et encore cela | |
[16:14] == CedCannes [~cedric@can06-1-82-242-221-217.fbx.proxad.net] has quit [Quit: Leaving.] | |
[16:14] <mageekguy> de mon point de vue, ça rend les tests plus lisibles, surtout lorsqu'on y revient longtemps après les avoir écrits | |
[16:15] <mageekguy> en tant que développpeur, on est tous habitué à ces structures | |
[16:15] <mageekguy> donc c'est cablé en quelque sorte dans notre cerveau, donc on lit et comprend plus vite | |
[16:15] <mageekguy> (en tout cas je marche comme ça) | |
[16:15] <mageekguy> et comme en plus la syntaxe behat est à la mode, ça ne coûte pas grand chose de s'en inspirer | |
[16:15] <Ludof> ouais, je vois l'intêret là, parce que c'est vrai qu'autant les assertions sont très jolies / lisible dans atoum. | |
[16:16] <Ludof> autant les préconditions c'est de la soupe. | |
[16:16] <Ludof> donc, ok, je capte mieux. | |
[16:16] <mageekguy> après tu peux parfaitement te passer de tout ça | |
[16:16] <mageekguy> si tu n'aimes pas | |
[16:16] <mageekguy> encore une fois, atoum essaye de ne rien imposer | |
[16:16] <Ludof> bah, faut voir, une convention on aime "jamais" au début quand c'est celle des autres. | |
[16:16] <mageekguy> d'ou la célébre formule qui fait tant rire usul, atoum, c'est comme le PMU, on joue comme on aime | |
[16:16] <Ludof> :D | |
[16:17] <Ludof> mais mes tests sont assez clean côté assertions, et assez "bordélique" côté pré-condition | |
[16:17] <mageekguy> donc je reprend, il y a une exception au simple "decorator", c'est assert | |
[16:17] <mageekguy> ->assert réinitialise les controlleurs de mock | |
[16:17] <Ludof> sauf qu'on s'en sert plus | |
[16:17] <Ludof> ah. | |
[16:17] <mageekguy> si | |
[16:17] <Ludof> bon à savoir ça. | |
[16:17] <mageekguy> c'est juste que dans la grande majorité des tests de atoum, ça sert pas | |
[16:17] <Ludof> mais techniquement, si je fais $this->string | |
[16:17] <mageekguy> donc on les dégage | |
[16:18] <mageekguy> si tu fais : | |
[16:18] <Ludof> c'est comme $this->assert->string() ? | |
[16:19] <mageekguy> $this->if($aMock = new \mock\...)->and...-> then->object($somethingWhichUseAMock->doSomething())->mock($aMock)->call('...')->once()->assert-> <= à ce moment, le controlleur de $aMock est réinitialisé | |
[16:20] <mageekguy> et donc le nombre d'appel qu'il a mémorisé lors de l'assertion précédente est remis à 0 | |
[16:20] <Ludof> ok, c'est uniquement le controlleur de mock | |
[16:20] <mageekguy> de tous les mocks | |
[16:20] <mageekguy> et des adapter, également | |
[16:20] == startupz [~startupz@LPuteaux-156-16-39-176.w82-127.abo.wanadoo.fr] has joined ##atoum | |
[16:20] <Ludof> (ouais les adapters j'ai pas suivi non plus) | |
[16:20] <mageekguy> tu peux aussi faire ->assert('Now we test the fucking case where all is shit")-> | |
[16:21] <Ludof> ok... je vois mieux la syntaxe | |
[16:21] <mageekguy> dans ce cas, 'Now we test the fucking case where all is shit" sera repris dans les messages de failure | |
[16:21] <Ludof> ouais parfait | |
[16:21] <mageekguy> mais encore une fois, le "titre" est facultatif | |
[16:21] <Ludof> quand tu dis | |
[16:22] <mageekguy> ça te permet de décrire tes différents tests au fil de l'eau de manière explicite et j'espère élégante | |
[16:22] <Ludof> le controleur de mock est reset, les closures injectées sont effacées ? | |
[16:22] <mageekguy> nop | |
[16:22] <mageekguy> juste le stockage des appels | |
[16:22] <Ludof> ok, donc assert c'est ton "scenario" | |
[16:22] <Ludof> if if, and and, then | |
[16:22] <Ludof> je capte. | |
[16:22] <Ludof> c'est super ça. | |
[16:22] <mageekguy> ça veut dire que si tu fais ->assert->mock($aMock)->call('method')->once(), ça failera forcément | |
[16:23] <Ludof> question rapide si tu as encore le temps | |
[16:23] <Ludof> les adapters ? | |
[16:23] <mageekguy> parce que le controlleur du mock n'aura aucun appel en mémoire | |
[16:23] <Ludof> what is this ? | |
[16:23] <mageekguy> les adapter, c'est des mocks pour les fonctions | |
[16:23] <Ludof> ok | |
[16:23] <mageekguy> d'ailleurs, le controlleur de mock hérite de l'adapter de test | |
[16:23] <mageekguy> même principe | |
[16:24] <mageekguy> du coup, tu peux faire $adapter->file_get_contents = false | |
[16:24] <mageekguy> et tu pourras tester ton code quand file_get_contents te retourne false | |
[16:24] <mageekguy> évidemment, il faut que tu ai un adapter d'injecté dans l'objet que tu tests | |
[16:24] <mageekguy> c'est pas parfait | |
[16:24] <Ludof> mmh ok, ca reste encore trouble pour moi | |
[16:24] <Ludof> mais en gros c'est un mocks | |
[16:24] <mageekguy> parce que certaines fonctions de php demande obligatoirement des références | |
[16:25] <mageekguy> et il faut une syntaxe particulière | |
[16:25] <mageekguy> ça permet de tester le comportement du code lorsqu'il utilise une fonction comme proc_open, par exemple | |
[16:25] <mageekguy> regarde tests/units/classes//test/engines/concurrent.php par exemple | |
[16:25] <mageekguy> c'est l'exemple parfait, je pense | |
[16:25] <Ludof> ok merci | |
[16:26] <mageekguy> parce que tu dois avoir tout les cas de figure | |
[16:26] <mageekguy> adapter = proxy pour les fonctions | |
[16:26] <mageekguy> et tu as aussi les mocks de stream | |
[16:26] <Ludof> oh, pour les fonctions natives php | |
[16:26] <jubianchi[work]> ludof: j'utilise beaucoup les adapteurs pour "simuler" la présence ou l'absence d'extension php par exemple | |
[16:26] <mageekguy> c'est sympa parce que ça permet de mocker entre autre les flux reseaux ou le file system | |
[16:26] <Ludof> ... ok y me manquait l'aspect "fonctions natives" | |
[16:26] <Ludof> wow c'est fou ça | |
[16:27] <Ludof> comment ça marche oO ? | |
[16:27] <mageekguy> c'est encore un peu "frustre", mais ça marche | |
[16:27] <Ludof> comment tu overrides ? | |
[16:27] <mageekguy> ça marche via un stream_wrapper | |
[16:27] <mageekguy> atoum:// | |
[16:27] <Ludof> wow... | |
[16:27] <mageekguy> et après tu peux définir le comportement de ton stream | |
[16:27] <Ludof> ok jamais touché à ça. ça a l'air puissant. | |
[16:27] <Ludof> (dangereux aussi) | |
[16:28] <Ludof> ok merci pour la mise à jour rapide, ca me suffit pour avancer, j'vais tester tout ça | |
[16:28] <mageekguy> regarde ./tests/units/classes/scripts/builder/vcs/svn.php pour un exemple d'utilisation des streams | |
[16:28] <mageekguy> c'est pas encore finalisé à 100%, il y a moyen d'améliorer l'API | |
[16:28] <Ludof> je me gist ce log irc avec tous les liens :) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment