mageekblog - Mot-clé - atoumLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearJ'ai oublié de vous dire… #2urn:md5:2ab3b1bba99308796c479626751dda752015-11-06T14:00:00+01:002015-11-06T15:13:33+01:00mageekguyConférencesatoumconférences<p>J’ai oublié de vous dire que je vais me livrer à un exercice inédit pour moi lors du <a href="http://event.afup.org">prochain forum PHP</a> les 23 et 24 novembre 2015.</p>
<p>En effet, <a href="http://afup.org/pages/site/">l’AFUP</a>, traditionnelle organisatrice de l’événement, me renouvelle à cette occasion sa confiance puisqu’elle a retenu ma proposition de conférence concernant <a href="https://github.com/atoum/atoum">atoum</a>.</p>
<p>Cependant, cette conférence sera très différente de celle que j’ai déjà eu l’occasion de donner à son sujet, puisque contrairement aux précédentes, elle ne se focalisera pas sur l’outil en tant que tel, mais sur ce qu’il s’est passé au cours de son développement depuis sa naissance à aujourd’hui.</p>
<p>Je souhaite en effet parvenir à réaliser au cours de ma conférence ce que l’on pourrait appeler une rétrospective agile du projet de sa naissance à aujourd’hui, en temps réel et avec la participation active du public, dans l’optique de parvenir à définir collectivement les actions à mener pour l’améliorer à tout point de vue.</p> <p>Ce sera aussi l’occasion pour moi d’expliquer ma vision du projet, les objectifs que je m’étais fixés, l’impact qu’il a eu sur ma vie personnelle et professionnelle et également le bon moment pour préciser très officiellement mon positionnement actuel en son sein.</p>
<p>L’objectif de cette conférence estdonc ambitieux et même si sa forme est encore loin d’être figée, je sais déjà que j’ai besoin de l’aide de tous ceux qui s’intéressent de près ou de loin à atoum. </p>
<p>Une bonne rétrospective nécessite en effet la présence des développeurs du produit (je peux déjà vous dire que certains seront dans la salle) mais aussi celle du client, et le client d’atoum, c’est vous.</p>
<p>Si vous n’avez pas déjà réservé votre place pour ce forum PHP qui se déroulera <a href="http://event.afup.org/forum-php-2015/acces/">à Paris au Beffroi de Montrouge</a>, je vous invite donc à le faire au plus vite pour que nous puissions discuter ensemble, en tête à tête et en toute franchise, de ce que représente atoum aujourd’hui et de ce qu’il sera potentiellement demain, sachant qu'en plus, il y a plein d'autres conférences semblant très intéressantes <a href="http://event.afup.org/forum-php-2015/programme/">au programme</a>, avec notamment un cycle intégralement dédié à PHP 7.</p>
<p>Et si pour une raison ou une autre, vous ne pouvez vous y rendre, ce n’est pas grave, car une rétrospective agile est basée sur le feedback.</p>
<p>Or, le feedback peut prendre bien des formes, et en conséquence, si vous souhaitez participer à cette conférence, je vous propose d’aider le projet de deux façons différentes et non exclusives.</p>
<p>Si votre entreprise utilise atoum, vous pouvez m’envoyer son nom via <a href="https://twitter.com/mageekguy">mon compte twitter</a> et <a href="https://twitter.com/search?q=%23atoum">#atoum</a> (en sachant que soit elle sera citée durant la conférence, soit son nom figurera sur mes supports).</p>
<p>Vous pouvez également m’envoyer, toujours par le même canal de communication, un ou plusieurs mots qui représente l’outil de votre point de vue, qu’il soit positif ou négatif, par exemple « inutile », « PHPUnit rocks » ou « facile à utiliser » (un troll est caché parmi ces exemples, saurez-vous le débusquer ?).</p>
<p>Et si vous avez un feedback à me donner qui ne peut prendre l’une de ces deux formes, mon adresse de courrier électronique n’est pas très difficile à trouver.</p>
<p>On se voit <a href="http://event.afup.org/forum-php-2015/programme/#1608">le 23 novembre à 15 h 30</a> à Paris pour reparler de tout cela ?</p>http://blog.mageekbox.net/?post/2015/11/06/J-ai-oubli%C3%A9-de-vous-dire%E2%80%A6-2#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/491De l'intérêt des testsurn:md5:dc43e360dc2954646f4cff0b234ace9a2014-01-31T21:20:00+01:002014-01-31T21:55:59+01:00mageekguyRéfléxionsatoumDemeterLiskovSOLIDtests<p>Il y a quelques jours, j’ai remarqué un fait intéressant.</p>
<p>En effet, j’avais encore il y a peu régulièrement envie de vomir lorsque je revenais sur du code quelque temps après l’avoir écrit.</p>
<p>Mais aujourd’hui, cette envie de vomir ne me prend plus lorsque je regarde mon code, mais plutôt les tests associés.</p>
<p>J’ai donc essayé de comprendre cette évolution, et j’en suis arrivé à la conclusion que cela vient du fait que ma façon de développer a profondément changé.</p>
<p>En effet, depuis que je développe <a href="http://www.atoum.org/atoum">atoum</a>, j’essaye (et ce n’est pas toujours facile, car les mauvaises habitudes ont la vie dure) de faire du <a href="http://fr.wikipedia.org/wiki/Test_Driven_Development">développement piloté par les tests</a>.</p> <p>De cette façon, j’obtiens donc forcément du code testable, donc du code qui respecte les principes fondamentaux de la programmation orientée objet tels que <a href="http://fr.wikipedia.org/wiki/SOLID_(informatique)">SOLID</a>, <a href="http://fr.wikipedia.org/wiki/Principe_de_substitution_de_Liskov">Liskov</a> et la <a href="http://fr.wikipedia.org/wiki/Loi_de_Déméter">loi de Demeter</a>.</p>
<p>Par contre, je me rends compte encore régulièrement que ma façon d’écrire des tests n’est pas forcément la meilleure, notamment lorsque je lis de la littérature sur le sujet ou lorsque je modifie le code d’une de mes classes afin de l’optimiser et que les tests associés passent au rouge alors que le périmètre fonctionnel n’a pas changé.</p>
<p>Il est donc finalement normal qu’aujourd’hui, mes tests me donnent régulièrement envie de vomir, d’autant plus qu’il n’existe pas à ma connaissance de bible de référence ou de lois aussi absolue que SOLID ou Demeter en ce qui concerne leur rédaction.</p>
<p>Il y a certes de très bonnes sources d’inspiration, mais l’information est fragmentée et le vocabulaire est souvent fluctuant en fonction des sources, d’autant qu’en règle générale elles sont spécifiques à un outil de test particulier et n’embrassent pas l’intégralité du domaine du test.</p>
<p>Dans un tel contexte, celui qui souhaite améliorer la qualité de ces tests le fait donc en fonction de l’outil qu’il utilise, de l’expérience qu’il acquière en le manipulant et de ses lectures.</p>
<p>Le coefficient directeur de sa courbe d’apprentissage est donc relativement faible et elle est de plus relativement linéaire, car l’apprentissage est très progressif par rapport à celui d’une personne qui disposerait d’une bible de référence efficace pour appréhender un nouveau domaine d’expertise.</p>
<p>J’ai de plus remarqué deux autres facteurs expliquant l’amélioration de la qualité de mon code depuis que j’ai adopté le développement piloté par les tests.</p>
<p>Le premier est que cette méthode de travail oblige en effet à suivre les bonnes pratiques de la programmation orientée objet, sans quoi le code devient très difficilement testable de manière correcte, c’est à dire avec un taux de couverture suffisamment significatif.</p>
<p>Et comme l’une de ces bonnes pratiques est de découpler fortement les fonctionnalités, je passe donc par exemple parfois un temps négligeable à réfléchir à un nom adéquat pour mes variables, propriétés, fonction, classe et interface afin d’avoir une sémantique suffisante pour que mon code reste compréhensible pour celui qui le découvre, ce qui confirme que <a href="http://www.meerkat.com/karlton/">Phil Karlton</a> a bien raison lorsqu’il dit que trouver un nom est l’une des deux seules choses réellement difficiles en informatique.</p>
<blockquote>
<p>There are only two hard things in Computer Science: cache invalidation and naming things.</p>
<div>Phil Karlton</div>
</blockquote>
<p>Le second facteur est que je développe plus lentement qu’auparavant, indépendamment du fait que j’écris maintenant des tests en plus du code.</p>
<p>Le développement piloté par les tests m’oblige en effet, pour que je puisse rédiger mes tests, à réfléchir à l’architecture de mon code avant de l’écrire, au lieu de laisser émerger cette architecture de mon code et éventuellement de la corriger à postériori, au risque d’y introduire des bogues ou de provoquer des régressions.</p>
<p>Et même si les tests facilitent le processus, car ils mettent le code en situation d’exploitation, cela peut être un réel challenge, notamment dans le cas de fonctionnalités complexes.</p>
<p>De plus, les tests sont une mise en pratique du code, et ils encouragent donc le développeur à gérer correctement les cas d’erreur ou limite, soit parce que ces derniers surviennent lors de l’exécution des tests, soit parce que leur écriture l’y fait penser naturellement.</p>
<p>En conséquence, ma productivité quotidienne instantanée a donc baissé puisque je réfléchis beaucoup plus que par le passé lorsque je développe, mais mécaniquement, la qualité de mon code en est augmentée d’autant.</p>
<p>De plus, je suis persuadé qu‘assez paradoxalement, cette amélioration de la qualité de mon code m’a à contrario fait augmenter ma productivité moyenne, notamment parce que les tests me permettent de remettre en cause partiellement ou totalement le code que j’ai écrit en ayant la garantie de ne pas altérer son fonctionnement, sans parler du fait que les tests documentent mon code automatiquement.</p>
<p>Reste que je n’ai aucune donnée objective pour étayer ce qui n’est donc qu’une intuition, et que je ne sais pas comment les obtenir alors qu’elles me permettraient de démontrer l’intérêt des tests sans coup férir.</p>http://blog.mageekbox.net/?post/2014/01/31/De-l-int%C3%A9r%C3%AAt-des-tests#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/472Atoum et HipHopVMurn:md5:60c9a698eb71ee1cbcfbff55390b213e2014-01-11T16:42:00+01:002014-01-12T20:41:43+01:00mageekguyPHPatoumHipHopVMZend Engine<p>Depuis quelque temps, on <a href="https://twitter.com/kenny_dee/status/418748352126521345">me demande régulièrement</a> si je vais rendre <a href="http://www.atoum.org/atoum">atoum</a> compatible avec <a href="https://github.com/facebook/hhvm">HipHopVM</a>, car il n’est actuellement pas compatible avec cette alternative au <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>.</p>
<p>Et ma réponse est que je n’ai aucune autre solution que celle consistant à faire les rapports de bugs nécessaires aux développeurs de <a href="https://github.com/facebook/hhvm">HipHopVM</a>.</p>
<p>Ce n’est en effet pas le code d’<a href="http://www.atoum.org/atoum">atoum</a> qui pose problème, puisqu’il fonctionne sans aucun soucis avec le moteur standard de <a href="http://www.php.net">PHP</a> (ce qui ne veut pas dire qu’il n’y a pas quelques bugs cachés en son sein malgré les quelque 1600 tests unitaires et les 24 000 assertions qui les traquent sans relâche).</p>
<p>Et si le problème ne vient pas du code d’<a href="http://www.atoum.org/atoum">atoum</a>, c’est donc qu’il vient d’un ou de plusieurs problèmes au sein de celui de <a href="https://github.com/facebook/hhvm">HipHopVM</a>.</p> <p>Je ne vois donc aucune raison pour que les contributeurs d’<a href="http://www.atoum.org/atoum">atoum</a> fassent l’effort nécessaire pour rendre <a href="http://www.atoum.org/atoum">atoum</a> compatible avec <a href="https://github.com/facebook/hhvm">HipHopVM</a>.</p>
<p>Et d’autant plus que <a href="https://github.com/facebook/hhvm">HipHopVM</a> est actuellement à mes yeux un outil certes intéressant, mais encore complètement inadapté à des développements en environnement professionnel ou utilisable en production.</p>
<p>Sa compatibilité avec le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> n’est en effet pas totale, et ses développeurs sont encore en pleine phase de recherche et développement pour y remédier.</p>
<p>Il n’y a d’ailleurs qu’à lire leur <a href="http://www.hhvm.com/blog/">blog</a>, par ailleurs très intéressant, pour s’en convaincre.</p>
<p>De plus, le fait de supporter <a href="https://github.com/facebook/hhvm">HipHopVM</a> dans son état actuel est à mon sens une très mauvaise stratégie pour obtenir à plus ou moins moyen terme une alternative au <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> digne de la production.</p>
<p>En effet, elle favoriserait l’émergence d’un nouveau langage qui aurait la couleur du <a href="http://www.php.net">PHP</a>, l’odeur du <a href="http://www.php.net">PHP</a>, mais qui ne serait pas du <a href="http://www.php.net">PHP</a> puisque la compatibilité du code que pourra exécuter <a href="https://github.com/facebook/hhvm">HipHopVM</a> ne sera pas garantie avec le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, et non celle d’une alternative crédible et surtout fiable à ce dernier.</p>
<p><a href="http://www.php.net">PHP</a> se retrouvera alors dans la même situation que Java, avec du code qui ne sera pas forcément exécutable sur la totalité des machines virtuelles disponibles (ceux qui ont essayé de faire tourner du code Java sous <a href="http://fr.wikipedia.org/wiki/Openjdk">OpenJDK</a> et <a href="http://fr.wikipedia.org/wiki/Machine_virtuelle_Java#HotSpot.2C_la_machine_virtuelle_d.27Oracle">HotSpot</a> comprendront sans problème ce que je veux dire).</p>
<p>L’utilisation du code et l’administration de son environnement d’exécution deviendront alors beaucoup plus complexes qu’actuellement, et cela alors que paradoxalement, beaucoup d’efforts ont été faits ces dernières années avec le développement d’un outil tel que composer et divers travaux périphériques pour justement simplifier l’installation et le déploiement du code.</p>
<p>Dans le pire des cas, cela pourrait même aboutir à une scission du marché.</p>
<p>Donc, en résumé, si des développeurs <a href="http://www.php.net">PHP</a> font les efforts nécessaires pour rendre leur code compatible avec <a href="https://github.com/facebook/hhvm">HipHopVM</a>, ils se tirent une balle dans le pied.</p>
<p>Alors que forcer (entre guillemets) les développeurs de <a href="https://github.com/facebook/hhvm">HipHopVM</a> à faire les corrections nécessaires dans leur code pour rendre ce dernier compatible à 100 % avec le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> permettra de mettre ces deux machines virtuelles en concurrence, à la fois au niveau des performances et au niveau des fonctionnalités.</p>
<p>En effet, si <a href="https://github.com/facebook/hhvm">HipHopVM</a> est totalement compatible avec le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, mais qu’il offre de meilleures performances ou des fonctionnalités supplémentaires, par exemple (totalement au pif) le support d’Unicode, les développeurs du <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> seront forcés de suivre le mouvement s’ils ne veulent pas voir leur bébé progressivement abandonné au profit de <a href="https://github.com/facebook/hhvm">HipHopVM</a>.</p>
<p>Ils seront alors obligés soit d’implémenter les fonctionnalités manquantes ou bien d’améliorer les performances du <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, l’un n’excluant pas l’autre évidemment.</p>
<p>Et pour la même raison, toute évolution fonctionnelle du <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> devra forcément être répercutée au niveau de <a href="https://github.com/facebook/hhvm">HipHopVM</a>.</p>
<p>Cela aura aussi comme effet de bord intéressant d'obliger les développeurs actuels de PHP à décrire le fonctionnement du langage, afin que tout le monde puisse à la fois suivre son évolution et éventuellement développer sa propre machine virtuelle en étant certain qu'elle est à 100% compatible avec l'ensemble du code existant.</p>
<p>Les utilisateurs de <a href="http://www.php.net">PHP</a> ont donc bien tout à gagner à tout faire pour disposer d’une alternative au <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a> qui soit totalement compatible avec ce dernier et comme je viens de l’expliquer, je pense que cela ne passe en aucun cas par une modification de leur code pour le rendre compatible avec <a href="https://github.com/facebook/hhvm">HipHopVM</a>.</p>
<p>En conséquence, le code d’<a href="http://www.atoum.org/atoum">atoum</a> ne sera pas modifié pour le rendre compatible.</p>
<p>Cependant, cela ne veut pas dire que les développeurs d’<a href="http://www.atoum.org/atoum">atoum</a> ne fourniront pas à ceux de <a href="https://github.com/facebook/hhvm">HipHopVM</a> toutes les informations à leur disposition afin qu’ils parviennent à rendre leur création à 100 % compatible avec le <a href="http://fr.wikipedia.org/wiki/Zend_Engine">Zend Engine</a>, car cela ne pourra qu’être bénéfique à la communauté des utilisateurs de <a href="http://www.php.net">PHP</a>.</p>
<p>Et c’est la raison pour laquelle le <a href="http://blog.mageekbox.net/?post/2013/07/09/Merci-a-la-marmotte-et-au-rasta-blanc">rasta blanc</a> y <a href="https://github.com/atoum/atoum/pull/316">travaille</a> !</p>http://blog.mageekbox.net/?post/2014/01/11/Atoum-et-HipHopVM#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/467La guerre des tests, épisode 2urn:md5:04a88b006b2ee7f3ec885ea5890a342c2013-10-22T09:45:00+02:002013-10-22T09:45:00+02:00mageekguyRéfléxionsatoumPHPprivatetests unitaires <p>On me demande très souvent si <a href="http://www.atoum.org/atoum">atoum</a> permet de tester les méthodes privées.</p>
<p>Et ma réponse est toujours négative, même si avec un peu d’astuce, l’utilisateur peut très bien faire en sorte de tester ces méthodes avec <a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Et à chaque fois que la question est posée, il y a souvent ensuite un débat plus ou moins important, aussi bien dans la communauté des utilisateurs que dans celle des contributeurs, à propos de la pertinence de cette fonctionnalité, à tel point que j’ai écris un billet intitulé <a href="http://blog.mageekbox.net/?post/2010/11/17/La-guerre-des-tests">la guerre des tests</a> pour exposer mon point de vue sur le sujet.</p>
<p>Depuis, je suis passé à autre chose, mais il y a quelques jours, le sujet est <a href="https://twitter.com/JeromeAvoustin/status/382129166705238016">revenu sur le tapis</a> via <a href="http://www.twitter.com">twitter</a>.</p>
<p>Les mêmes causes produisant les mêmes effets, malgré la qualité des intervenants, la discussion est rapidement devenue stérile, et le format imposé par <a href="http://www.twitter.com">twitter</a> n’a certainement pas aidé.</p>
<p>Du coup, tout comme moi il y a trois ans, <a href="https://blog.crafting-labs.fr">Antoine Vernois</a> s’est fendu lui aussi <a href="https://blog.crafting-labs.fr/?post/2013/10/21/Test-unitaire-et-methodes-privees">d’un billet sur son blog</a> pour expliquer son point de vue à ce sujet.</p>
<p>Et c’était vraiment une excellente idée, car si nous sommes d’accord sur le fond, je trouve le sien bien meilleur que le mien sur la forme !</p>http://blog.mageekbox.net/?post/2013/10/22/La-guerre-des-tests-episode-2#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/458Allez à la prochaine conférence de l'AFUP Lyon !urn:md5:e3b9e6d866bc75e0a3bfaa30e519dcc42013-10-15T10:50:00+02:002013-10-15T10:50:00+02:00mageekguyConférencesAFUPatoumHoaIvan EnderlinLyon<p>Si vous êtes dans la région lyonnaise et que vous aimez le code original aussi bien techniquement que fonctionnellement parlant, ou si vous êtes blasés des frameworks à la mode ou si vous pensez que ces outils sont performants, mais qu’ils ne sont pas suffisamment modulaires ou manque d’originalité, je vous invite à venir à <a href="http://lyon.afup.org/2013/10/01/conference-sur-hoa-le-28-octobre-a-19h00/">la prochaine conférence</a> oganisée par <a href="http://lyon.afup.org">l’antenne lyonnais de l’AFUP</a> le 28 octobre 2013 à 19 h.</p>
<p><a href="https://twitter.com/hoaproject">Ivan Enderlin</a> y présentera en effet <a href="http://hoa-project.net">Hoa</a>, l’ensemble de bibliothèques en <a href="http://www.php.net">PHP</a> qu’il a créé et qui contient des fonctionnalités très puissantes et pour certaines très surprenantes tout en offrant des performances remarquables.</p>
<p>Cette conférence sera aussi l’occasion pour vous de discuter avec l’un des rares chercheurs en informatique français travaillant à la fois sur <a href="http://www.php.net">PHP</a> et sur le test logiciel.</p> <p>Ivan est en effet thésard à l’UFR Sciences et Techniques de Besançon et travaille de plus avec l’INRIA ainsi qu’avec l’Institut Femto-ST.</p>
<p>C’est donc quelqu’un de très compétent et qui maîtrise parfaitement ces sujets, même les plus pointus, et la moindre discussion peut aller très loin, même s’il est parfois difficile de le suivre tellement il est passionné.</p>
<p>Bref, cette conférence sera pour vous l’occasion de découvrir des outils hors-normes et peu connus et qui sont conçus par un garçon qui vaut le détour.</p>
<p>Et je ne dis pas cela parce qu’il sera accompagné sur scène par <a href="http://blog.mageekbox.net/?post/2013/07/09/Merci-a-la-marmotte-et-au-rasta-blanc">le rasta blanc</a>, aka <a href="https://twitter.com/jubianchi">@jubianchi</a> et que certains outils développés dans le cadre de Hoa et concernant le test logiciel vont être intégrés à plus ou moins court terme dans <a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Je pense en effet que c’est une réelle opportunité de découvrir des outils novateurs et puissants peu connus, car occultés par les frameworks dans le vent alors qu’ils peuvent avoir une réelle utilité en entreprise.</p>http://blog.mageekbox.net/?post/2013/10/15/Allez-a-la-prochaine-conference-de-l-AFUP-Lyon#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/457À propos de ma façon de contribuer à atoumurn:md5:4417bb029cd9753c3770549721c8df292013-09-26T14:00:00+02:002013-09-26T14:00:00+02:00mageekguyatoumatoumphptests unitaires<p>Jusqu’à maintenant, j’ajoutais des fonctionnalités dans <a href="http://www.atoum.org/atoum">atoum</a> de manière très indépendante, en fonction de mes besoins et de ma veille technologique.</p>
<p>Je faisais donc le développement correspondant totalement isolé du monde, puis je livrais le résultat final en pâture à mes utilisateurs et j’ajustais ensuite éventuellement en fonction de leur retour.</p>
<p>Or, ce processus a aujourd’hui plusieurs inconvénients.</p> <p>Tout d’abord, c’est une attitude très dictatoriale, et si je suis d’accord avec le fait qu’un projet doit être dirigé par un <a href="http://www.framablog.org/index.php/post/2008/12/01/logiciels-libres-et-dictateur-bienveillant">dictateur bienveillant</a>, je ne suis pas à l’aise avec l’idée d’écarter aussi radicalement les autres contributeurs de mes travaux.</p>
<p>De plus, ce processus est complètement différent de celui suivi par les contributeurs, puisqu’ils ajoutent leur code à celui d’<a href="http://www.atoum.org/atoum">atoum</a> via le mécanisme de <q><a href="https://github.com/atoum/atoum/pulls">pull request</a></q> de Github, et je ne pense pas que le fait d’être le créateur d’<a href="http://www.atoum.org/atoum">atoum</a> me donne le droit de déroger aux règles que je demande aux autres d’appliquer.</p>
<p>Mais surtout, ce processus de développement implique que je ne peux bénéficier d’aucun retour technique ou fonctionnel de la part des contributeurs ou des utilisateurs à propos de mon code avant que je ne décide de le diffuser.</p>
<p>En conséquence, je me prive d’un feedback qui pourrait m’être très utile pour rendre <a href="http://www.atoum.org/atoum">atoum</a> encore plus simple, moderne et intuitif, même s’il arrive souvent que je discute des fonctionnalités sur lesquelles je suis en train de travailler sur <a href="http://fr.irc2go.com/webchat/?net=freenode&room=%23%23atoum">le canal IRC</a> du projet.</p>
<p>J'ai donc modifié depuis quelques jours ma façon de travailler sur <a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Je commence dorénavant par créer une <q><a href="https://github.com/atoum/atoum/issues/265">issue</a></q> décrivant la fonctionnalité que je compte ajouter ou l’évolution que je compte effectuer, ce qui permet à tout le monde <a href="https://github.com/atoum/atoum/issues/268">de donner son opinion</a> à son sujet.</p>
<p>Et à l’avenir, mon code sera ajouté au projet après être passé par l’étape <q>pull request</q> afin qu’il fasse l’objet (du moins, je l’espère) d’une revue poussée avant d’être fusionné définitivement dans celui d’<a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Cerise sur le gâteau, cela me permettra de garder une trace de mes développement en cours.</p>
<p>En effet, j’avais laissé plusieurs d’entre eux en attente lorsque je suis parti en vacances dernièrement, et à mon retour, j’ai eu le plus grand mal à m’y retrouver, voir même à simplement à me souvenir de l’objectif final de certains.</p>
<p>J’espère donc que cette nouvelle façon de travailler sur <a href="http://www.atoum.org/atoum">atoum</a> me permettra d’éviter ce genre de désagrément à l’avenir.</p>http://blog.mageekbox.net/?post/2013/09/26/A-propos-de-ma-facon-de-contribuer-a-atoum#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/451AFUP de Lyon + atoum = conférenceurn:md5:5c5e75db3886da19dad2147646c101952013-09-05T14:30:00+02:002013-09-05T14:30:00+02:00mageekguyConférencesAFUPatoumconférencesLyon <p>Une nouvelle fois, <a href="http://lyon.afup.org">l’AFUP de Lyon</a> me donne l’opportunité de faire découvrir <a href="http://www.atoum.org/atoum">atoum</a> aux développeurs <a href="http://www.php.net">PHP</a> de la région lyonnaise et je l’en remercie.</p>
<p>En effet, si son cycle de conférences a été interrompu par les vacances estivales, il reprend dès maintenant et je présenterais donc <a href="http://lyon.afup.org/2013/09/05/conference-sur-atoum-le-10-septembre-a-19h30/">le mardi 10 septembre à 19 h 30</a> <a href="http://www.atoum.org/atoum">atoum</a> en général et plus particulièrement les outils qu’il propose nativement et qui permettent de tester du code faisant appel à des services web, le tout dans les locaux lyonnais de l’Epitech.</p>
<p>Et <a href="https://twitter.com/jubianchi">Julien Bianchi</a>, surnommé <a href="http://blog.mageekbox.net/?post/2013/07/09/Merci-a-la-marmotte-et-au-rasta-blanc">le rasta blanc</a>, vous fera ensuite une démonstration de l’intégration d’<a href="http://www.atoum.org/atoum">atoum</a> dans l’<abbr title="Integrated Development Environment">IDE</abbr> <a href="https://netbeans.org">NetBeans</a>. </p>
<p> Il est en effet le mieux placé pour cela puisque c’est lui qui a conçu la majeure partie du code nécessaire du côté d’<a href="http://www.atoum.org/atoum">atoum</a>, en partenariat avec <a href="https://twitter.com/tmysik">@tmysik</a> du côté de chez <a href="https://netbeans.org">NetBeans</a>.</p>
<p>Je profite d’ailleurs de l’occasion pour remercier <a href="https://netbeans.org">NetBeans</a> d’avoir été le premier éditeur d’<abbr title="Integrated Development Environment">IDE</abbr> à avoir fait le travail nécessaire pour supporter <a href="http://www.atoum.org/atoum">atoum</a>, même si j’espère <a href="http://youtrack.jetbrains.com/issue/WI-11602">que d’autres suivront</a>.</p>
<p>Ceci étant dit, j’ajoute que s’il nous reste un peu de temps à l’issue de la démonstration de <a href="https://twitter.com/jubianchi">@jubianchi</a>, nous pourrons vous parler des futures évolutions d’<a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Donc si vous êtes intéressés, je vous invite <a href="http://afup-lyon-atoum.eventbrite.com">à réserver votre place</a> au plus vite !</p>http://blog.mageekbox.net/?post/2013/09/05/AFUP-de-Lyon-atoum-conference#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/445Je suis en vacances !urn:md5:c16a6c719ad899d39b9cf15f445120732013-08-14T17:30:00+02:002013-08-14T17:30:00+02:00mageekguyRéfléxionsatoumPHPUnitvacances<p>Je suis à partir de maintenant en vacances jusqu’au 2 septembre.</p>
<p>En conséquence, ce blog va potentiellement vivre au ralenti jusqu’à cette date (potentiellement car il est possible que quelques billets soient en attente de publication automatique), tout comme le développement d’<a href="http://atoum.org/atoum">atoum</a>.</p>
<p>Concernant ce dernier, <a href="http://blog.mageekbox.net/?post/2013/07/09/Merci-a-la-marmotte-et-au-rasta-blanc">le rasta blanc et la marmotte</a> seront, je pense, présent pour assurer l’intérim au mieux, ainsi que tous les membres du canal <abbr title="Internet Relay Chat">IRC</abbr> ##atoum sur le réseau Freenode.</p>
<p>Je n’ai en effet aucune envie de toucher le moindre clavier au cours de mes congés pour quoi que ce soit relatif à mon travail ou à mes projets personnels, car j’ai vraiment besoin de faire une pause.</p> <p>J’ai actuellement de plus en plus de mal à me motiver et après presque 8 mois sans congés, je sature malgré le fait que j’ai <a href="http://blog.mageekbox.net/?post/2013/07/04/Timeline.d3.js">élargi mon horizon</a> ces derniers temps en utilisant <a href="http://blog.mageekbox.net/?post/2013/07/10/phpfpm.cubism.js">des langages autres que le PHP</a>.</p>
<p>J’en suis d’ailleurs arrivé à un tel degré de fatigue mentale que j’ai vraiment du mal à écrire du code correct et à organiser mes idées correctement, ce qui me ralentit fortement dans toutes mes activités informatiques.</p>
<p>Je vais donc me consacrer jusqu’à début septembre exclusivement et pour mon plus grand plaisir à ma famille et à l’aménagement de notre maison.</p>
<p>J’espère ainsi me remotiver et attaquer la rentrée en pleine forme, d’autant qu’elle s’annonce chargée puisque ma femme va reprendre son activité professionnelle et que j’ai énormément de choses en attente dans les tuyaux.</p>
<p>En effet, mon état fait que j’ai commencé dernièrement beaucoup de choses sans trouver le courage et la force de les finaliser à 100 %.</p>
<p><a href="http://atoum.org/atoum">Atoum</a> s’est en effet vu récemment doté d’un système permettant de simuler très facilement les fonctions natives de <a href="http://www.php.net">PHP</a>.</p>
<p>Cependant, si le code nécessaire à sa mise en œuvre est fonctionnel, ce n’est pas le cas des assertions correspondantes et s’il est donc possible de simuler toutes les fonctions natives du langage, il n’est pas encore possible de vérifier qu’elles sont appelées dans le bon ordre et avec les bons arguments.</p>
<p>Dans le même style, je dois également finaliser le développement du système de fichier virtuel intégré à <a href="http://atoum.org/atoum">atoum</a> qui est à l'arrêt depuis maintenant plusieurs mois.</p>
<p>Le <a href="https://twitter.com/jubianchi">rasta blanc</a> a de son côté travaillé sur <a href="https://github.com/atoum/atoum/pull/227">un pont entre PHPUnit et atoum</a> et il est donc aujourd’hui capable de faire exécuter par <a href="http://atoum.org/atoum">atoum</a> une suite de tests écrite pour PHPUnit quasiment sans aucune contrainte.</p>
<p>Il a publié son travail pour avoir l’avis de la communauté, mais malheureusement, je n’ai trouvé ni l’occasion ni le courage de le regarder, et il en va de même pour un certain nombre d’autres choses.</p>
<p>J’ai de plus quelques projets, par exemple l’écriture d’un livre sur les tests en général et <a href="http://atoum.org/atoum">atoum</a> en particulier, la création d’un jeu en <a href="http://www.aerotwist.com/tutorials/getting-started-with-three-js/">WebGL</a> nécessitant un <a href="https://www.leapmotion.com">Leap Motion</a> ou celui d’enfin écrire l’histoire qui m’a été demandée dans le cadre d’un livre collaboratif.</p>
<p>Je vais donc me reposer intellectuellement en me plongeant dans le bricolage et me ressourcer auprès des miens quelque temps afin de pouvoir m’attaquer à tout cela dans les meilleures conditions possible, d’autant que ma rentrée professionnelle s’annonce déjà chargée.</p>
<p>D’ici là, je souhaite d’excellentes vacances à tous ceux qui partent comme moi en congés, et bon courage à ceux qui ont déjà repris le chemin du travail ou qui vont le faire prochainement !</p>http://blog.mageekbox.net/?post/2013/08/14/Je-suis-en-vacances#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/441Merci à la marmotte et au rasta blanc !urn:md5:b1e18ecca3d0bc01d92ff57f340c65d52013-07-09T14:00:00+02:002013-07-09T14:00:00+02:00mageekguyatoumatoumJulien BianchiRenaud Littolfftests unitaires<p><a href="http://www.atoum.org/atoum">Atoum</a> a la chance de profiter du travail d'une <a href="https://twitter.com/marmotz">marmotte</a> et d'un <a href="https://twitter.com/jubianchi">rasta blanc</a>.</p>
<p>Sur Internet, ils se nomment respectivement @marmotz et @jubianchi, mais dans la vraie vie, ils s’appellent Renaud Littolff et <a href="http://jubianchi.fr">Julien Bianchi</a>.</p>
<p>Et pour paraphraser <a href="http://fr.wikipedia.org/wiki/Barney_Stinson">Barney Stinson</a>, ils sont tous deux proprement hallucinants et ce n'est pas à cause du fait que l'un hiberne la moitié de l'année et que l'autre peut être confondu avec un <a href="http://fr.wikipedia.org/wiki/Yautja">Yautja</a> dans l'obscurité lorsqu'il a son casque vissé sur les oreilles.</p> <p>La marmotte est en effet à la fois l’auteur sous le nom de <a href="https://soundcloud.com/al0ne">al0ne</a> de <a href="http://medias.atoum.org/goodies/deeper&deeper.mp3">« Deeper & Deepeer »</a>, la musique officielle d’atoum, ainsi que celui de son <a href="http://docs.atoum.org/fr">excellente documentation française</a>, et s’il est au départ parti de celle rédigée par <a href="http://www.croes.org/gerald/blog/">Gérald Croes</a> (Gérald, si tu nous lis…), il l’a profondément remaniée, aussi bien dans la forme que dans le fond.</p>
<p>Il en a en effet entièrement modifié l’organisation et il a de plus participé au développement des outils permettant de la rédiger et de la publier.</p>
<p>Cependant, il ne contribue pas au projet uniquement en rédigeant sa documentation, puisqu’il a également <a href="https://github.com/atoum/atoum/pull/228">des idées</a> très intéressantes pour rendre <a href="http://www.atoum.org/atoum">atoum</a> plus efficace.</p>
<p>De plus, il n’hésite pas à se battre et à me contredire pour défendre ses idées, ce qui occasionne parfois quelques discussions houleuses entre nous, mais qui se terminent toujours sans la moindre rancune même s’il n’a pas toujours le dernier mot.</p>
<p>Et accessoirement, son humour décalé et son ton acide et ironique sont en grande partie responsable de la bonne humeur qui règne sur le canal <abbr title="Internet Relay Chat">IRC</abbr> d’<a href="http://www.atoum.org/atoum">atoum</a> (réseau Freenode, canal ##atoum), et cela d’autant plus depuis qu’il y a fait venir <a href="http://www.patedamandine.fr">une pâtissière</a> qui nous fait profiter de ses recettes.</p>
<p>La marmotte est donc à mes yeux un contre-pouvoir productif, parfois exaspérant, souvent amusant, mais dans tous les cas toujours utile, car il apporte une vision différente de la mienne et il ne souhaite qu’une chose, c’est que le projet avance dans ce qu'il considère comme étant « la bonne direction ».</p>
<p>Le rasta blanc participe quant à lui au développement d’<a href="http://www.atoum.org/atoum">atoum</a> d’une manière beaucoup plus « technique », puisqu’il est actuellement le plus gros contributeur au code du projet après moi.</p>
<p>Il a ainsi entre autres choses développé la publication du rapport de couverture du code par les tests au format HTML, le rapport permettant de générer les informations nécessaires à <a href="https://coveralls.io/r/atoum/atoum">coveralls</a>, l’affichage du logo d’<a href="http://www.atoum.org/atoum">atoum</a> en vert ou en rouge en fonction du fait que les tests passent ou non avec succès ainsi que la gestion des notifications.</p>
<p>Il a également finalisé le développement du rapport <abbr title="Test Anything Protocol">TAP</abbr> servant d’interface entre <a href="http://www.atoum.org/atoum">atoum</a> et <a href="https://netbeans.org">Netbeans</a> (et potentiellement <a href="http://youtrack.jetbrains.com/issue/WI-11602">d’autres IDE</a>), il est l’auteur de <a href="https://github.com/jubianchi/atoum.js">atoum.js</a> qui est le pendant en JavaScript d’<a href="http://www.atoum.org/atoum">atoum</a> et enfin il est en train de développer <a href="https://github.com/atoum/atoum/pull/227">un pont</a> entre PHPUnit et <a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Et je ne parle pas du support et de l’évangélisation qu’il fait au quotidien ainsi que de toutes les petites choses qu’il a ajoutées au projet pour le rendre encore plus simple, moderne et intuitif.</p>
<p>En bref, ce mec est un malade, parce qu’en plus, il a fait tout cela extrêmement bien, en quasi-autonomie et avec ce que j’ai l’habitude d’appeler « le bon esprit », c’est à dire avec sérieux, humilité et simplicité (et en prime, il développe <a href="https://github.com/jubianchi?tab=repositories">plein d'autres choses sympathiques</a>).</p>
<p>Et j’en ai encore eu la preuve aujourd’hui.</p>
<p>Hier, il a détecté un problème et nous en avons parlé deux minutes (et encore…) sur IRC.</p>
<p>Ce matin, il a ouvert <a href="https://github.com/atoum/atoum/issues/233">le ticket correspondant</a> contenant à la fois le code et les tests unitaires permettant de reproduire le problème avant de proposer pratiquement dans la foulée <a href="https://github.com/atoum/atoum/pull/234">un correctif impeccable</a> permettant de le résoudre.</p>
<p>Je tenais donc à les remercier encore une fois, car même s'ils ne sont pas les seuls à participer à l'évolution d'<a href="http://www.atoum.org/atoum">atoum</a>, sans eux, il ne serait certainement pas aussi simple, moderne, intuitif, fiable et bien documenté (du moins en français…).</p>http://blog.mageekbox.net/?post/2013/07/09/Merci-a-la-marmotte-et-au-rasta-blanc#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/433Timeline.d3.jsurn:md5:8742af712221646de3592a6805aadb552013-07-04T13:30:00+02:002013-07-04T13:30:00+02:00mageekguyRéfléxionsatoumd3.jsmoment.jsPHP<p>J’utilise <a href="http://www.php.net">PHP</a> quotidiennement, en général plus de 8 heures par jour réparties entre mes développements professionnels et des projets personnels tels qu’<a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Pour autant, je ne suis pas d’une fidélité exemplaire et je vais parfois voir ailleurs pour plusieurs raisons.</p>
<p>Il m’arrive en effet d’en avoir marre de voir des lignes de code à longueur de temps et de ressentir le besoin de manipuler des choses plus graphiques.</p>
<p>Ensuite, je trouve bénéfique d’allez voir ce qu’il se fait ailleurs afin de voir s’il n’est pas possible de mettre en application certains concepts intéressants dans mon propre contexte.</p> <p>Dernièrement, je me suis donc amusé un peu avec <a href="http://fr.wikipedia.org/wiki/Quartz_Composer">Quartz Composer</a> et avec <a href="http://d3js.org">d3.js</a>.</p>
<p>Ces deux outils ont en effet l’avantage d’être simples et rapides à appréhender, ce qui permet d’obtenir un résultat relativement intéressant en un minimum de temps.</p>
<p>Or, le temps est une ressource rarissime dans mon univers et ces outils sont donc très intéressants pour moi.</p>
<p>J’ai donc développé il y a quelque temps <a href="http://blog.mageekbox.net/?post/2012/12/22/Horloge-binaire">un économiseur d’écran pour OS X</a> prenant la forme d’une <a href="https://github.com/mageekguy/BinaryClock">horloge binaire</a>, et j’ai créé <a href="http://treemap.atoum.org">une représentation du taux de couverture d’un code par ses tests unitaires</a> originale à l’aide de <a href="http://d3js.org">d3.js</a>.</p>
<p>Et comme j’ai vraiment pris un grand plaisir à utiliser <a href="http://d3js.org">d3.js</a>, car tout comme <a href="http://www.atoum.org/atoum">atoum</a>, son utilisation est simple et intuitive, j’ai décidé de l’utiliser à nouveau à l’occasion de la publication de <a href="http://www.php.net">PHP</a> 5.5.</p>
<p>En effet, lorsque j’ai commencé la rédaction de mon <a href="http://blog.mageekbox.net/?post/2013/06/28/Impressive">précédent billet</a>, mon objectif était de décrire les apports de cette nouvelle version.</p>
<p>Cependant, depuis un certain temps, je me disais que le rythme de publication des versions du langage s’était considérablement accéléré, à tel point que j’ai du mal à le suivre.</p>
<p>Et après réflexion, il m’a semblé plus pertinent de mettre en lumière ce phénomène qui montre la vitalité de <a href="http://www.php.net">PHP</a> sur la durée plutôt que les nouvelles fonctionnalités de cette version 5.5.</p>
<p>Je me suis donc mis en quête à la fois <a href="http://php.net/eol.php">des données nécessaires</a> et d’un outil capable de les représenter efficacement sous une forme graphique.</p>
<p>Mon premier réflexe a donc été de lancer Numbers, mais j’ai bien vite compris que je ne parviendrais pas à obtenir ce que je désirais avec ce logiciel et j’ai alors pensé à <a href="http://d3js.org">d3.js</a>.</p>
<p>Ce projet se présente en effet lui-même comme un outil conçu pour manipuler des documents représentant des données, ce qui correspondait exactement à mon besoin et allait même au-delà puisqu’il permet de générer <a href="https://github.com/mbostock/d3/wiki/Gallery">des graphiques interactifs</a>.</p>
<p>J’ai donc demandé à mon moteur de recherche favori de me localiser un script utilisant <a href="http://d3js.org">d3.js</a> me permettant d’obtenir une représentation graphique des dates de sorties des différentes versions de <a href="http://www.php.net">PHP</a>.</p>
<p>Las, je n’ai pas trouvé de solution clef en main me satisfaisant et j’ai donc décidé de développer la mienne en me basant sur <a href="http://bl.ocks.org/bunkat/2338034">celle</a> qui correspondait le plus à mon besoin.</p>
<p>Grâce à la puissance de <a href="http://d3js.org">d3.js</a>, mais également de <a href="http://momentjs.com">moment.js</a>, j’ai donc obtenu relativement rapidement un résultat suffisant pour me permettre de publier un graphique acceptable dans mon billet.</p>
<p>Et cerise sur le gâteau, j’ai même lié à cette image la page permettant la génération du graphique.</p>
<p>Cependant, je ne me suis pas arrêté là et j’ai poursuivi mon développement, car je souhaitais ajouter un certain nombre de fonctionnalités.</p>
<p>Un profond remaniement de code plus tard afin d’avoir un code plus efficace et plus facile à maintenir et à faire évoluer, j’avais donc ajouté la possibilité de visualiser d’une manière plus précise une partie du graphe, amélioré la gestion des informations affichées et géré un nouveau paramètre permettant de représenter graphiquement le temps depuis lequel une version est obsolète.</p>
<p><a href="http://mgbx.net/phptimeline" title="timelined3js.png"><img src="http://blog.mageekbox.net/public/.timelined3js_m.jpg" alt="timelined3js.png" style="margin: 10px auto; display: block; " title="timelined3js.png, juil. 2013" /></a></p>
<p>Donc si vous êtes <a href="http://mgbx.net/phptimeline">dans le rouge</a>, vous êtes très mal et je vous encourage à <a href="http://fr2.php.net/manual/en/migration54.php">mettre à jour</a> votre version de <a href="http://www.php.net">PHP</a> le plus rapidement possible !</p>
<p>Il ne me reste aujourd’hui qu’à nettoyer un peu le code, permettre d’acquérir les données via une requête asynchrone afin de permettre la mise à jour automatique du graphe et corriger quelques problèmes esthétiques mineurs.</p>
<p>Accessoirement, je viens de le mettre sur <a href="https://github.com/mageekguy/timeline.d3.js">github</a>.</p>
<p>Le développement de ce code ne m’a pas posé de problème particulier, même si la programmation orientée objet en javascript ne s’appréhende pas du tout de la même façon dans ce langage qu’en <a href="http://www.php.net">PHP</a> et qu’il est assez facile d’obtenir des comportements très étranges lorsque l’on n’a pas pleinement conscience de ce que représente <code>this</code> lorsqu’on le manipule (dire qu’on dit que <a href="http://www.php.net">PHP</a> a des comportements étranges…).</p>
<p>La gestion du temps, absolument indispensable dans le cadre de ce graphique, n’a pas non plus été un problème grâce à <a href="http://momentjs.com">moment.js</a>.</p>
<p>Tout comme <a href="http://d3js.org">d3.js</a>, cet outil est en effet un véritable concentré de simplicité et d’efficacité qui permet au développeur de s’affranchir totalement de la problématique habituellement posée par la manipulation de données temporelles tous langages confondus, à tel point que sa documentation est presque inutile alors qu’elle est juste parfaite.</p>
<p>D3.js ne m’a pas non plus posé de problèmes particuliers, si ce n’est à cause de ma propre bêtise et de la fatigue induite par le fait que je m’obstine à coder jusqu’à minuit passé.</p>
<p>Sa documentation est en effet excellente et il existe de très nombreux exemples d’utilisation sur Internet dont l’étude permet de trouver le moyen d’obtenir un résultat particulier.</p>
<p>O'reilly publie de plus <a href="http://chimera.labs.oreilly.com/books/1230000000345/">un excellent livre</a> intitulé « Interactive Data Visualization for the Web » qui a l’énorme avantage d’être <a href="http://chimera.labs.oreilly.com/books/1230000000345/index.html">lisible gratuitement en ligne</a> et dans son intégralité et qui explique très bien les différents concepts mis en œuvre par <a href="http://d3js.org">d3.js</a>.</p>
<p>Il est donc très facile de trouver une solution à un problème.</p>
<p>Bref, j’ai passé un excellent moment loin de <a href="http://www.php.net">PHP</a>, et non, ce billet n'est pas sponsorisé.</p>http://blog.mageekbox.net/?post/2013/07/04/Timeline.d3.js#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/431Mangez votre nourriture pour chien !urn:md5:477db6f954a0cee88ddb4c7a72e8dd482013-06-19T22:28:00+02:002013-06-20T10:58:54+02:00mageekguyRéfléxionsatoumfournisseur de donnéesPHPPHPUnittests unitaires<p>Aujourd'hui, j’ai utilisé pour la première fois les fournisseurs de données d’<a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Cela peut sembler à première vue très paradoxal, étant donné que je suis le développeur principal d’<a href="http://www.atoum.org/atoum">atoum</a> et que j’ai conçu seul le système de gestion des fournisseurs de données, mais il se trouve que je ne suis pas fan de <a href="http://phpunit.de/manual/3.7/fr/phpunit-book.html#writing-tests-for-phpunit.data-providers">ce concept</a> emprunté à <a href="http://blog.mageekbox.net/?post/2013/06/19/http:///phpunit.de">PHPUnit</a>.</p>
<p>D’après <a href="http://docs.atoum.org/fr/chapitre2.html#Fournisseurs-de-donnees-data-provider">la documentation française</a> d’<a href="http://www.atoum.org/atoum">atoum</a>, un fournisseur de données est <q>une méthode d’une classe de test chargée de générer des arguments pour une méthode de test, arguments qui seront utilisés par ladite méthode pour valider des assertions</q>.</p> <p>Le fournisseur de données doit donc retourner un tableau ou un intégrateur contenant les arguments qui seront automatiquement transmis par <a href="http://www.atoum.org/atoum">atoum</a> à toutes les méthodes de test auxquelles est rattaché le fournisseur de données lors de l’exécution des tests.</p>
<blockquote><pre><code><?php
class calculator extends atoum
{
/**
* @dataProvider sumDataProvider
*/
public function testSum($a, $b)
{
$this
->if($calculator = new project\calculator())
->then
->integer($calculator->sum($a, $b))->isEqualTo($a + $b)
;
}
public function sumDataProvider()
{
return array(
array( 1, 1),
array( 1, 2),
array(-1, 1),
array(-1, 2),
);
}
}</code></pre></blockquote>
<p>Et si j’ai toujours trouvé le concept intéressant dans le fond, j’ai toujours trouvé que la forme nuisait à la lisibilité des tests.</p>
<p>De plus, j’ai rarement rencontré un cas de figure ou leur utilisation était réellement pertinente.</p>
<p>L’un dans l’autre, cela explique pourquoi je n’ai jamais mis en œuvre les fournisseurs de données jusqu’à aujourd’hui alors que j’en ai réalisé l’implémentation.</p>
<p>Cependant, aujourd’hui, j’ai rencontré un cas de figure dans lequel leur utilisation s’imposait.</p>
<p>J’avais en effet défini deux méthodes de tests très similaires puisque la seule différence de comportement entre les deux méthodes que je testais était le fait que l’une devait retourner $this, tandis que la seconde devait renvoyer un clone de $this.</p>
<p>De plus, les deux méthodes étaient testées avec les mêmes arguments.</p>
<blockquote><pre><code><?php
class path extends atoum
{
…
public function testRelativizeFrom()
{
$this
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom($path))
->isIdenticalTo($path)
->toString->isEqualTo('.')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/a', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('./b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/a/', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('./b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/c', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/c/', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/c/d', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('../../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/c/d/', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('../../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->relativizeFrom(new testedClass('/', '/')))
->isIdenticalTo($path)
->toString->isEqualTo('./a/b')
;
}
public function testGetRelativizedPathFrom()
{
$this
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom($path))
->isNotIdenticalTo($path)
->toString->isEqualTo('.')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/a', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('./b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/a/', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('./b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/c', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/c/', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/c/d', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('../../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/c/d/', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('../../a/b')
->if($path = new testedClass('/a/b', '/'))
->then
->object($path->getRelativizedPathFrom(new testedClass('/', '/')))
->isNotIdenticalTo($path)
->toString->isEqualTo('./a/b')
;
}
…
}</code></pre></blockquote>
<p>L’utilisation d’un fournisseur de données s’imposait donc afin de mutualiser la gestion des arguments afin de supprimer la duplication de code induite par le fait que j’utilisais dans les deux méthodes de test exactement les mêmes arguments.</p>
<p>De plus, grâce au fournisseur de données, je pourrais au besoin ajouter un cas de test supplémentaire pour chacune des deux méthodes de test en modifiant uniquement le fournisseur de données.</p>
<p>J’ai donc défini les annotations <code>@dataProvider</code> nécessaires pour chacune des deux méthodes de test, ainsi que la méthode nécessaire à la génération de leurs arguments.</p>
<p>Et je me suis alors rendu compte de la lourdeur du processus.</p>
<p>En effet, pour mettre en place mon fournisseur de données, j’ai été obligé d’ajouter l’annotation mentionnée précédemment pour chacune des deux méthodes afin de définir la méthode devant être utilisée comme telle.</p>
<p>De plus, j’ai été obligé d’ajouter à chacune de mes deux méthodes de test les arguments nécessaires.</p>
<p>Or, il est tout à fait possible de se passer totalement de la définition de l’annotation.</p>
<p>En effet, si une méthode de test accepte des arguments, elle fait nécessairement appel à un fournisseur de données.</p>
<p>Et si une convention existe permettant de déduire automatiquement à partir du nom d'une méthode de test le fournisseur de données correspondant, il devient alors possible pour le développeur des tests de ne pas annoter sa méthode de test pour indiquer à <a href="http://www.atoum.org/atoum">atoum</a> le fournisseur de données qu’elle devra utiliser lors de l’exécution des tests.</p>
<p>La rédaction des tests deviendrait alors plus simple et intuitive…</p>
<p>J’ai donc modifié le code d’<a href="http://www.atoum.org/atoum">atoum</a> afin que si une méthode de test accepte des arguments et qu’elle ne dispose pas de l’annotation <code>@dataProvider</code>, elle utilise alors automatiquement et sans aucune intervention de l’utilisateur le fournisseur de données modélisé par la méthode protégée ou privée portant le nom résultat de la concaténation du nom de la méthode de test et de la chaîne de caractères <code>'DataProvider'</code>.</p>
<blockquote><pre><code><?php
class path extends atoum
{
…
public function testRelativizeFrom($path, $directorySeparator, $fromPath, $fromDirectorySeparator, $relativePath)
{
$this
->if($path = new testedClass($path, $directorySeparator))
->then
->object($path->relativizeFrom(new testedClass($fromPath, $fromDirectorySeparator)))
->isIdenticalTo($path)
->toString->isEqualTo($relativePath)
;
}
public function testGetRelativizedPathFrom($path, $directorySeparator, $fromPath, $fromDirectorySeparator, $relativePath)
{
$this
->if($path = new testedClass($path, $directorySeparator))
->then
->object($path->getRelativizedPathFrom(new testedClass($fromPath, $fromDirectorySeparator)))
->isNotIdenticalTo($path)
->toString->isEqualTo($relativePath)
;
}
protected function testRelativizeFromDataProvider()
{
return array(
array('/a/b', '/', '/a/b', '/', '.'),
array('/a/b', '/', '/a', '/', './b'),
array('/a/b', '/', '/a/', '/', './b'),
array('/a/b', '/', '/c', '/', '../a/b'),
array('/a/b', '/', '/c/', '/', '../a/b'),
array('/a/b', '/', '/c/d', '/', '../../a/b'),
array('/a/b', '/', '/c/d/', '/', '../../a/b'),
array('/a/b', '/', '/', '/', './a/b')
);
}
protected function testGetRelativizedPathFromDataProvider()
{
return $this->testRelativizeFromDataProvider();
}
…
}</code></pre></blockquote>
<p>Quelques lignes de code plus tard et quelques itérations successives puisque je n’ai pas compris immédiatement que l’annotation pouvait devenir totalement facultative, <a href="http://www.atoum.org/atoum">atoum</a> facilitait donc encore un peu plus la vie du développeur des tests en lui permettant de ne pas avoir à se soucier de certains détails d’implémentation durant leur rédaction.</p>
<p>J’ai donc eu la preuve que suivre l’adage <q><a href="http://fr.wikipedia.org/wiki/Dogfooding">Eat your own dog food</a></q> est le meilleur moyen d’améliorer son code pour un développeur !</p>http://blog.mageekbox.net/?post/2013/06/19/Mangez-votre-nourriture-pour-chien-%21#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/428À propos de atoum #3urn:md5:e482248a6f0f923cbfa0c3c96764234c2013-05-30T14:00:00+02:002013-05-30T14:00:00+02:00mageekguyatoumAmaury BouchardatoumHoaIvan EnderlinPHPSkrivMLtests unitaires<p>S’il y a bien une chose que je n’avais pas du tout anticipée lorsque j’ai libéré le code d’<a href="http://www.atoum.org/atoum">atoum</a>, c’est qu’il provoquerait une coopération entre plusieurs projets.</p>
<p>La <a href="http://docs.atoum.org">documentation</a> d’<a href="http://www.atoum.org/atoum">atoum</a> est en effet actuellement maintenu par <a href="https://twitter.com/marmotz">Renaud Littolff</a> et il a choisi de la rédiger en <a href="http://markup.skriv.org">SkrivML</a>, un langage de description de page dérivé du markdown et du Creole dévoilé par <a href="http://www.geek-directeur-technique.com/2009/01/23/Je-me-presente...">Amaury Bouchard</a> il y a <a href="http://www.geek-directeur-technique.com/2013/02/17/lancement-officiel-du-skrivml">quelque temps</a>.</p>
<p>Atoum profite donc du travail de <a href="http://www.geek-directeur-technique.com/2009/01/23/Je-me-presente...">Amaury</a> grâce auquel il dispose d’une <a href="http://docs.atoum.org">documentation</a> facile à maintenir et à faire évoluer.</p>
<p>Cependant, cette relation est loin d’être à sens unique.</p> <p><a href="https://twitter.com/marmotz">Renaud</a> a en effet rencontré un certain nombre de problématiques lors de la rédaction de la <a href="http://docs.atoum.org">documentation</a> d’<a href="http://www.atoum.org/atoum">atoum</a> et il a donc apporté à Amaury un précieux « feedback » qui lui a permis de faire évoluer SkrivML et les outils associés en fonction des besoins réels de ses utilisateurs.</p>
<p>Et parfois, il a tout simplement proposé une solution « clef en main » qu’<a href="http://www.geek-directeur-technique.com/2009/01/23/Je-me-presente...">Amaury</a> n’a eu qu’à <a href="https://github.com/Amaury/SkrivMarkup/pulls?direction=desc&page=1&sort=created&state=closed">intégrer dans son code</a>.</p>
<p>Cerise sur le gâteau, la <a href="http://docs.atoum.org">documentation</a> d’<a href="http://www.atoum.org/atoum">atoum</a> est à mon avis une excellente démonstration de ce que permet de réaliser SkrivML et elle offre donc une très bonne vitrine au projet de Amaury.</p>
<p>La relation entre les deux projets est donc du type « gagnant-gagnant » et de plus, elle a permis à deux développeurs de faire connaissance et de s’apprécier (du moins je l’espère).</p>
<p>Un autre exemple de collaboration est ce qui est en train de se passer entre <a href="http://www.atoum.org/atoum">atoum</a> et <a href="http://hoa-project.net">Hoa</a>.</p>
<p>Ce dernier intègre en effet un outil dénommé <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a> qui permet à la fois de générer des données de test et de générer des tests en fonction d’un contrat.</p>
<p>Je ne donnerais pas plus d’information maintenant sur l’outil ainsi que sur ses possibilités, car j’ai prévu d’en parler dans le détail dans le cadre d’une interview de son créateur <a href="https://twitter.com/hoaproject">Ivan Enderlin</a>.</p>
<p>Cependant, si je vous dis que <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a> rend possible la génération automatique d’une suite de test à partir d’un contrat, je pense que vous comprendrez rapidement ce qu’il est possible de faire à l’aide d’un outil fusionnant les possibilités d’<a href="http://www.atoum.org/atoum">atoum</a> et celles de cet outil.</p>
<p>Et encore une fois, il s’agit d’une relation « gagnant-gagnant » car <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a> profite des possibilités et de l’efficacité d’<a href="http://www.atoum.org/atoum">atoum</a> en ce qui concerne l’exécution des tests, et <a href="http://www.atoum.org/atoum">atoum</a> profite de <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a> pour proposer à ses utilisateurs une façon novatrice de rédiger des tests.</p>
<p>En effet, <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a> est le fruit des travaux de recherche que <a href="https://twitter.com/hoaproject">Ivan</a> mène dans le domaine du test à l’<a href="http://fr.wikipedia.org/wiki/Institut_national_de_recherche_en_informatique_et_en_automatique">INRIA</a> et la fusion de ces deux projets risque donc bien d’aboutir à une nouvelle façon plus efficace à tout point de vue d’appréhender le test logiciel dans l’univers PHP.</p>
<p>Certes, pour cela, il faudra que ce « pont » qu’il est en train de bâtir entre nos deux projets valide ses théories, mais connaissant le bonhomme, j’ai bon espoir que ce soit effectivement le cas.</p>
<p>Et tout comme dans le cas de SkrivML, cette collaboration a permis à deux développeurs de faire connaissance et de s’apprécier puisque <a href="https://twitter.com/hoaproject">Ivan</a> a travaillé avec <a href="https://twitter.com/jubianchi">Julien Bianchi</a> pour permettre à <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a> de générer des tests exécutables avec <a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Et le plus beau dans tout cela, c’est que je ne suis quasiment jamais intervenu, que ce soit par rapport aux problématiques relatives à SkrivML ou à celles en rapport avec <a href="http://fr.wikipedia.org/wiki/Praspel">Praspel</a>.</p>
<p>Non pas que ces sujets ne m’intéressent pas, bien au contraire, mais il se trouve qu’à chaque fois, je ne disposais pas du temps nécessaire et que de plus, j’y ai vu une excellente opportunité pour que d’autres s’approprient <a href="http://www.atoum.org/atoum">atoum</a> et que le projet puisse donc à terme vivre sans moi !</p>http://blog.mageekbox.net/?post/2013/05/30/A-propos-de-atoum-3#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/425TDD versus BDDurn:md5:431cf5464946856c466281bc547c47c42013-04-29T15:41:00+02:002013-04-29T22:37:47+02:00mageekguyRéfléxionsatoumBDDBehatPHPSpecTDD<p>De plus en plus souvent, j’entends dire que le <abbr title="Behavior Driven Development">BDD</abbr> est mieux que le <abbr title="Test Driven Development">TDD</abbr>.</p>
<p>Et à chaque fois je ne peux m’empêcher de sourire doucement, car un développeur qui fait du <abbr title="Behaviour Driven Development">BDD</abbr> fait en réalité du <abbr title="Test Driven Development">TDD</abbr> , d’après « l’inventeur » du <abbr title="Behaviour Driven Development">BDD</abbr>.</p>
<p>Le concept de <abbr title="Behaviour Driven Development">BDD</abbr> est en effet apparu pour la première fois en mars 2006 dans un article de <a href="http://j.mp/vHRQWp">Better Software</a>, un magazine ayant pour thème principal la qualité logicielle.</p>
<p><a href="http://dannorth.net">Dan North</a>, l’auteur de <a href="http://dannorth.net/introducing-bdd/">l’article en question</a>, y explique en substance que pour faire face à l’incompréhension et aux difficultés que la mise en œuvre du <abbr title="Test Driven Development">TDD</abbr> suscitait chez les développeurs, il a eu l’idée d’en changer le vocabulaire afin de le rendre plus « accessible ».</p> <p>Afin d’en occulter l’aspect technique, il a donc remplacé le mot « test » par celui de « behaviour » et ainsi rendu la rédaction des tests plus évidente et intuitive pour les développeurs.</p>
<p>Grâce à ce petit changement sémantique, le développeur n’écrit plus un test, il définit le comportement que doit avoir le code.</p>
<p>De plus, afin de rendre l’écriture des tests encore moins technique et toujours plus accessible et intuitive, il a également fait en sorte de permettre la définition de ce comportement non plus à l’aide d’un langage de programmation, mais à l’aide d’un langage naturel.</p>
<p>Grâce à cela, un vocabulaire commun entre le développeur et le métier peut être mis en place et le développeur n’est plus le seul à pouvoir lire, comprendre ou écrire un test.</p>
<p>Et c’est efficace, puisque 7 ans après la rédaction de cet article, le <abbr title="Test Driven Development">BDD</abbr> a le vent en poupe actuellement.</p>
<p>Rien que dans l’univers PHP, le succès d’un outil tel que <a href="http://behat.org">Behat</a> qui permet la rédaction de test fonctionnel en <abbr title="Test Driven Development">BDD</abbr> le démontre.</p>
<p>Pour autant, un test à la sauce <abbr title="Behaviour Driven Development">BDD</abbr> reste un test, et il est donc très possible de faire du <abbr title="Test Driven Development">BDD</abbr> avec un outil de <abbr title="Test Driven Development">TDD</abbr>.</p>
<p>En effet, un test à la sauce <abbr title="Behaviour Driven Development">BDD</abbr> fait techniquement exactement la même chose qu’un test à la sauce <abbr title="Test Driven Development">TDD</abbr> puisqu’il vérifie le résultat que doit fournir un code en fonction des données qui lui sont fournies.</p>
<p>Ou exprimé autrement, le <abbr title="Behaviour Driven Development">BDD</abbr> étant essentiellement une évolution sémantique, la seule différence technique entre un test en <abbr title="Test Driven Development">BDD</abbr> et un test en <abbr title="Test Driven Development">TDD</abbr> est son formalisme.</p>
<p>Il est donc très possible pour un développeur d’écrire avec un outil de <abbr title="Test Driven Development">TDD</abbr> bien conçu tel qu’<a href="http://www.atoum.org/atoum">atoum</a> un test compréhensible par l’Humain.</p>
<blockquote><pre><code><?php
namespace vendor\project\tests\units;
use atoum, vendor\project\helloWord as testedClass;
class helloWorld extends atoum
{
function testSay()
{
$this
->given($helloWorld = new testedClass())->then->string($helloWorld->say())->isEqualTo('Hello World!')
;
}
}
</code></pre></blockquote>
<p>Et voici le test équivalent rédigé à l’aide de <a href="http://www.phpspec.net">PHPSpec</a>, un outil de <abbr title="Behaviour Driven Development">BDD</abbr> :</p>
<blockquote><pre><code><?php
namespace spec\HelloWorld;
use PHPSpec2\ObjectBehavior;
class HelloWorld extends ObjectBehavior
{
function it_says_hello()
{
$this->say()->shouldReturn('Hello World!');
}
}
</code></pre></blockquote>
<p>Alors, faut-il mieux faire du <abbr title="Test Driven Development">TDD</abbr> ou du <abbr title="Behaviour Driven Development">BDD</abbr> ?</p>
<p>Si vous avez compris ce qui précède, vous avez compris que cette question est stupide, puisque le <abbr title="Test Driven Development">TDD</abbr> ou le <abbr title="Behaviour Driven Development">BDD</abbr> ne sont que les deux facettes d’une même pièce.</p>
<p>Alors, comment choisir entre un outil dédié au <abbr title="Behaviour Driven Development">BDD</abbr> et un outil dédié au <abbr title="Test Driven Development">TDD</abbr> ?</p>
<p>Il n’y a pas de réponse absolue à cette question.</p>
<p>En effet, étant donné que chaque outil de test a ses propres forces, ses propres faiblesses et sa propre philosophie, le développeur choisira essentiellement en fonction de ses préférences personnelles.</p>
<p>Cependant, de mon point de vue, l’approche du <abbr title="Behaviour Driven Development">BDD</abbr> n’a que peu d’intérêt dans le cas de tests unitaires.</p>
<p>En effet, ce type de test est de très bas niveau et le code qu’il valide n’est qu’un pavé encastré dans la route qui conduit à la réalisation du besoin exprimé par le métier.</p>
<p>Il me semble donc inutile à un niveau aussi bas de disposer d’un outil de test permettant d’impliquer fortement le métier, puisque le code développé à l’aide de ces tests aura forcément une très forte composante technique très éloignée de ses préoccupations.</p>
<p>Un bon outil de test unitaire « traditionnel » est donc une option à mon sens parfaitement viable dans le cadre des tests unitaires, surtout s’il a été conçu de façon à être simple et intuitif.</p>
<p>À contrario, un outil de <abbr title="Behaviour Driven Development">BDD</abbr> tel que <a href="http://behat.org">Behat</a> me semble plus que recommandé dans le cas de tests fonctionnels. Ces derniers valident en effet un besoin métier et il est donc bénéfique pour le projet d’avoir à ce niveau une collaboration forte entre le développeur et le métier.</p>
<p>Ce n’est cependant que mon avis et de toute façon, que vous écriviez des tests en <abbr title="Test Driven Development">TDD</abbr> ou en <abbr title="Behaviour Driven Development">BDD</abbr> n’a aucune importance, car comme je l’ai expliqué, c’est blanc bonnet et bonnet blanc.</p>
<p>L’important, c’est d’écrire des tests !</p>http://blog.mageekbox.net/?post/2013/04/29/TDD-versus-BDD#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/421À propos de la politique de développement de atoumurn:md5:93cdb32c3ea3ef6ff8b694d3e1dfe95c2013-04-26T14:00:00+02:002013-04-26T14:04:45+02:00mageekguyatoumatoumtests fonctionnelstests manuelstests unitaires<p><a href="https://twitter.com/timbarray">Timothée Barray</a> a écrit récemment un <a href="http://www.amicalement-web.net/atoum-tire-la-couverture/2013/04/24/">article</a> à propos d’<a href="http://www.atoum.org/atoum">atoum</a> dans lequel il souligne l’extrême réactivité des contributeurs lorsqu’un bug doit être corrigé.</p>
<p>Cette rapidité de réaction ne doit rien au hasard puisqu’elle est entre autres induite par la politique de développement mise en place depuis quasiment le début du projet.</p>
<p>En effet, le développement d’<a href="http://www.atoum.org/atoum">atoum</a> a été <a href="http://fr.wikipedia.org/wiki/Test_Driven_Development">piloté par des tests</a> écrits avec <a href="http://www.atoum.org/atoum">atoum</a> lui-même dès que cela a été possible.</p>
<p>Les contributeurs disposent donc au moment ou j’écris ces lignes d’une collection de tests unitaires qui représente un total de 20250 assertions réparties dans 1393 méthodes et 176 classes.</p>
<p>Grâce à cela, le code d’<a href="http://www.atoum.org/atoum">atoum</a> est couvert à plus de 80 % par les tests.</p> <p>Mais pourquoi « seulement » 80 % alors que le développement d’<a href="http://www.atoum.org/atoum">atoum</a> a été piloté par les tests ? </p>
<p>Tout simplement parce que le développement de certaines portions de son code n’a pas été piloté par les tests, car <a href="http://www.atoum.org/atoum">atoum</a> n’était pas fonctionnel à ce moment puisqu’en cours de développement.</p>
<p>Et ce taux de couverture de « seulement » 80 % n’est de toute façon pas réellement un problème.</p>
<p>En effet, <a href="http://www.atoum.org/atoum">atoum</a> se testant avec lui-même, chaque contributeur effectue implicitement sur <a href="http://www.atoum.org/atoum">atoum</a> des tests manuels lorsqu’il travaille sur son code.</p>
<p>En conséquence, si les tests unitaires laissent passer un bug, ce qui ne peut manquer d’arriver, car l’Humain est faillible, alors les tests manuels permettront éventuellement de le détecter.</p>
<p>Il sera alors reproduit sous la forme d’un test unitaire qui viendra s’ajouter à ceux déjà existants avant d’être corrigé, ce qui permettra d’éviter sa réapparition à l’avenir.</p>
<p>Ainsi, contrairement à ce que la plupart des développeurs semblent penser, les tests automatisés, qu’ils soient unitaires ou fonctionnels, ne rendent aucunement les tests manuels facultatifs.</p>
<p>En effet, en l’état actuel de la Science, l’intervention humaine est encore indispensable, autant au niveau de la conception des tests que de leur exécution, car la machine ne dispose pas encore de la puissance et de l’intelligence nécessaire pour générer les tests permettant de vérifier la validité technique et fonctionnelle d’un code.</p>
<p>Alors, quel est l’intérêt d’avoir des tests automatisés s’ils doivent impérativement être complétés par des tests manuels ?</p>
<p>Il y en a plusieurs.</p>
<p>Tout d’abord, ils sont exécutés par une machine qui coûte beaucoup moins cher à une entreprise qu’un salarié, puisqu’une machine a un coût fixe amortissable alors que ce n’est pas le cas du salarié.</p>
<p>Donc même si le salarié doit passer du temps à écrire des tests, la machine reste tout de même extrêmement plus rentable que lui, d’autant que pendant qu’elle travaille, il peut continuer à développer.</p>
<p>Et si d’aventure le développeur fait du développement piloté par les tests, le coût des tests est alors intégré au coût du développement et devient donc totalement transparent, ce qui augmente encore l’intérêt des tests automatisés d’un point de vue financier.</p>
<p>De plus, les tests automatisés sont exécutés par la machine qui garantie, de par sa nature, qu’ils seront exécutés de manière exhaustive, alors que ce n’est pas le cas lorsqu’ils sont exécutés par l’Humain, ce dernier étant faillible par nature.</p>
<p>J’ajoute que la machine exécute les tests beaucoup plus rapidement que l’Humain.</p>
<p>Or, il a été démontré que plus un bug est détecté tôt, moins sa correction coûte cher.</p>
<p>Enfin, les tests unitaires permettent d’obtenir un certain nombre d’informations à propos du code et donc de quantifier sa qualité, ne serait-ce que grâce au taux de couverture et même si ce dernier est à prendre avec des pincettes dans le cadre de PHP.</p>
<p>Les tests unitaires ont donc très clairement un intérêt puisqu’ils permettent d’augmenter la productivité du développeur tout en limitant les coûts.</p>
<p>Cependant, malgré leur forte valeur ajoutée, ils ne sont pas magiques et sont complémentaires des tests manuels et ne les remplace en aucune manière en l’état actuel de la technologie.</p>
<p>Et de même, les tests unitaires ne rendent pas les tests fonctionnels facultatifs, tout comme les tests fonctionnels ne rendent pas les tests unitaires facultatifs.</p>
<p>Tout comme les tests automatisés et les tests manuels, ils sont en effet complémentaire même s’ils sont tous deux automatisés.</p>
<p>Nous en avons d’ailleurs régulièrement la preuve dans le cadre du développement d’<a href="http://www.atoum.org/atoum">atoum</a>, car à ce jour le projet ne contient aucun test fonctionnel.</p>
<p>Or, la plupart des bugs qui nous sont rapportés auraient pu être détectés à l’aide de tests fonctionnels.</p>
<p>En effet, les tests unitaires virtualisent à l’aide de bouchons les dépendances des méthodes testées.</p>
<p>Or, cette virtualisation <a href="https://twitter.com/fabpot/status/327389152691777536">peut ne pas refléter la réalité</a>, tout comme la Matrice peut ressembler à la réalité, mais pour autant permettre des comportements irréalistes.</p>
<p>Faut-il pour autant éviter de recourir au bouchonnage ou bien <a href="https://twitter.com/lsmith/status/327390811136352256">en limiter drastiquement et arbitrairement</a> l’utilisation ? </p>
<p>Je ne le pense pas.
</p>
<p>Il me semble que la solution est de vérifier la corrélation entre le monde virtuel défini par les tests unitaires et la (parfois) dure réalité grâce aux tests fonctionnels qui eux s’exécutent dans un cadre très proche sinon identique à celui de la production.</p>
<p>Les tests fonctionnels vont alors permettre aussi bien la détection des éventuels bugs présents dans le code que ceux présents dans les tests, faisant d'une pierre deux coups.</p>
<p>De plus, un test unitaire indique qu’une méthode utilisée individuellement se comporte correctement dans le contexte défini par le test.</p>
<p>Cependant, cela ne donne aucune garantie sur son fonctionnement lorsque cette méthode doit collaborer avec d’autres dans le cadre d’une application et dans un contexte de production.</p>
<p>Or, le test fonctionnel peut apporter dans une certaine mesure cette garantie puisqu'il met en jeu le code dans son intégralité et non plus uniquement une méthode isolée.</p>
<p>Enfin, il peut être parfois très difficile techniquement d’écrire un test unitaire, ou alors cela prendrait bien trop de temps pour être rentable économiquement parlant.</p>
<p>La solution est alors non pas de ne pas tester, mais d’écrire un test fonctionnel qui est bien souvent plus simple à mettre en place.</p>
<p>Les tests fonctionnels sont donc clairement le chaînon manquant actuellement dans la chaîne de production d’<a href="http://www.atoum.org/atoum">atoum</a> et j’espère trouver le temps à moyen de terme d’y remédier.</p>
<p>Malgré la mise en place d’une intégration continue sur Travis ainsi que sur notre propre infrastructure, nous avons donc des axes d’amélioration possible en ce qui concerne la politique de développement d’<a href="http://www.atoum.org/atoum">atoum</a>.</p>
<p>Mais reste que malgré cette carence en test fonctionnel, nous disposons d’une base de test qui nous permet d’avoir la quasi-certitude que le code se comporte toujours de la même façon qu’auparavant après une modification, ce qui nous permet de réagir très rapidement sans devoir passer par une longue et fastidieuse phase de tests manuels tout en ayant confiance dans la qualité de nos modifications.</p>
<p>C’est par exemple grâce à cela que j’ai pu modifier en profondeur et en quelques minutes le fonctionnement du système de bouchonnage d’<a href="http://www.atoum.org/atoum">atoum</a> en ayant la quasi-certitude de ne pas avoir introduit un bug.</p>
<p>Comme l’a rappelé <a href="http://www.twitter.com/omansour">Olivier Mansour</a> dans son <a href="http://oliviermansour.com/2013/04/21/enfin-une-bonne-mesure-de-la-qualite-logicielle-ou-presque/">dernier billet</a>, « un test, c’est mieux que pas de test ! ».</p>http://blog.mageekbox.net/?post/2013/04/26/A-propos-de-la-politique-de-d%C3%A9veloppement-de-atoum#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/420Pourquoi atoum est-il open-source ?urn:md5:cea9bc40e442f635196f2e822a44d5be2013-04-16T18:30:00+02:002013-04-16T19:39:48+02:00mageekguyatoumatoumFrançois Zaninottoopen-sourcephpPHPUnitSimpleTest<p><a href="https://github.com/fzaninotto">François Zaninotto</a> a donné lors du <a href="http://paris2013.live.symfony.com">Symfony Live 2013</a> une conférence qui a apparemment eu un impact fort sur <a href="http://www.mikaelrandy.fr/2013/04/11/retour-sur-le-symfonylive-2013-partie-3-seconde-journee/">certaines personnes</a> que je connais et qui y ont assisté.</p>
<p>C’est donc avec un grand intérêt que j’ai lu <a href="http://redotheweb.com/2013/04/11/pourquoi-symfony-est-il-open-source.html">son billet</a> intitulé « Pourquoi Symfony est-il (encore) open-source ? » qui reprend sous forme textuelle le propos qu’il a tenu lors de sa conférence.</p>
<p>En résumé, en se basant sur sa propre expérience, il y explique que le développeur qui libère son code réalise un acte politique puissant qui n’a rien à voir avec la morale et qui n’est pas désintéressé, car il crée de la valeur indépendamment d’un échange marchand, ce qui lui permet de tisser un lien social et de reprendre le contrôle afin d’avoir une influence sur l’avenir.</p>
<p>J’avoue avoir été dubitatif lors de ma première lecture.</p>
<p>Mais ayant moi-même libéré du code notamment dans le cadre <a href="http://www.atoum.org/atoum">d’atoum</a>, il m’a semblé pertinent de confronter son point de vue à ma propre expérience en toute honnêteté, ce qui n’a pas été très facile même si cela a été enrichissant, car cela m’a obligé à reconnaître que ma démarche était très loin d’être désintéressée.</p> <p>Les bases de ce qu’est <a href="http://www.atoum.org/atoum">atoum</a> aujourd’hui ont été écrites en 2005.</p>
<p>À l’époque, je venais de créer ma société avec quelques amis et j’avais besoin d’un framework de tests unitaires.</p>
<p>Or, ceux existant à l’époque, à savoir PHPUnit et SimpleTest, étaient écrits en PHP 4 et ne profitaient donc pas de la puissance de PHP 5 tout juste disponible et que j'utilisais pour mes développement.</p>
<p>J’ai donc commencé à coder mon propre outil en PHP 5 en utilisant notamment <a href="http://fr2.php.net/manual/en/class.reflection.php">l’introspection</a> et en mélangeant des concepts issus aussi bien de SimpleTest que de PHPUnit.</p>
<p>Puis, au fil des mois et des années, l’outil a évolué en fonction de mes besoins, de ceux de mes collègues et surtout en fonction de <a href="http://www.php.net">PHP</a>.</p>
<p>Il me servait en effet durant cette période de laboratoire pour expérimenter les nouvelles fonctionnalités du langage, et cela jusqu’en 2010.</p>
<p>Cette année a été très particulière.</p>
<p>Tout d’abord, <a href="http://blog.mageekbox.net/?post/2010/03/17/Repose-en-paix%2C-PHP-6">PHP 6 a été enterré</a> et j’ai alors commencé à faire <a href="http://blog.mageekbox.net/?post/2010/03/25/Mort-de-PHP6-10-jours">la chronique</a> du développement de PHP 5.4, ce qui m’a donné une certaine notoriété parmi la communauté des développeurs francophones.</p>
<p>Ensuite, PHP 5.3 était à l’époque, et <a href="http://blog.mageekbox.net/?post/2013/04/01/PHP-5.2-contient-une-bombe-logique">c’est malheureusement toujours le cas aujourd’hui</a>, très loin d’être la version du langage la plus utilisée.</p>
<p>De plus, le test était, tout comme aujourd’hui à mon grand regret, la dernière roue du carrosse dans le domaine du développement logiciel, pour ne pas dire la roue de secours ou même une option totalement facultative.</p>
<p>J’ajoute que SimpleTest était moribond et que PHPUnit était quasi l’unique option viable si l’on voulait écrire et exécuter des tests unitaires en <a href="http://www.php.net">PHP</a>.</p>
<p>Et à mes yeux, ce dernier était très loin d’être un outil très agréable à utiliser et il représentait donc un frein important à la mise en œuvre des tests en entreprise.</p>
<p>Or, j’avais sous la main du code moderne basé sur PHP 5.3 et qui rendait l’écriture des tests simple et intuitive et leur exécution très performante.</p>
<p>Enfin, j’étais à l’époque à la recherche d’un emploi.</p>
<p>Le fait que je devais libérer le code source d’<a href="http://www.atoum.org/atoum">atoum</a> s’est donc très rapidement imposé à moi.</p>
<p>En effet, le fait de proposer un outil de tests unitaires simple et pratique à utiliser requérant PHP 5.3 pour fonctionner pouvait encourager les développeurs à la fois à migrer vers PHP 5.3 et à écrire des tests.</p>
<p>Je pouvais de plus utiliser ma popularité naissante pour promouvoir mon outil et lui donner une visibilité suffisante pour atteindre une certaine masse critique et lui permettre d’avoir une influence significative sur la façon dont les développeurs travaillent.</p>
<p>J’obtenais également ainsi sans frais et très rapidement un portfolio très représentatif de mes compétences, ce qui est loin d’être inintéressant lorsqu’on est à la recherche d’un emploi.</p>
<p>Enfin, quelque part dans un coin de ma tête, j’avais l’espoir de pouvoir en vivre à plus ou moins long terme en mettant en œuvre les conseils de <a href="http://www.stevepavlina.com/articles/courage-to-live-consciously.htm">Steve Pavlina</a>, même si je ne connaissais absolument pas ses écrits à l'époque.</p>
<blockquote cite="http://fr.wikipedia.org/wiki/Dale_Carnegie"><p>Inaction breeds doubt and fear. Action breeds confidence and courage. If you want to conquer fear, do not sit home and think about it. Go out and get busy.</p>
</blockquote>
<p>Certes, une fois écrites noir sur blanc, mes motivations de l’époque semblent bien ambitieuses et égoïstes, mais cela ne fait que prouver les dires de <a href="https://github.com/fzaninotto">François</a> selon lesquels la morale n’a pas sa place dans cette démarche.</p>
<p>De plus, je voulais très clairement reprendre le contrôle en proposant une alternative à PHPUnit et surtout avoir une influence, ce qui peut s’apparenter à l’acte politique que dénonce <a href="https://github.com/fzaninotto">François</a>, même si je n’irais pas jusqu’à parler de Révolution comme il le fait.</p>
<p>J’ajoute que depuis cette époque, une communauté s’est progressivement créée autour d’<a href="http://www.atoum.org/atoum">atoum</a> et donc de moi et j’ai tissé des liens plus ou moins forts avec certains contributeurs alors même que je n’ai jamais rencontré physiquement la plupart d’entre eux.</p>
<p>Là encore, <a href="https://github.com/fzaninotto">François</a> a fait mouche dans son propos, car même s’il s’agit d’un effet de bord et non d’une motivation à l’origine, j’ai reçu de l’amitié en <a href="http://fr.wikipedia.org/wiki/Don_et_contre-don">contre-don</a>, en plus de temps et de soutien pour faire avancer le projet.</p>
<p>Enfin, j’ai contribué à créer de la valeur alors que la libération du code d’<a href="http://www.atoum.org/atoum">atoum</a> n’a donné lieu à aucune transaction marchande directe.</p>
<p>Il est en effet utilisé par des sociétés diverses et variées telles que <a href="http://tech.m6web.fr/integration-continue-avec-jenkins-et-atoum">M6 Web</a>, <a href="http://www.mozfr.org">Mozilla</a>, Orange, <a href="http://www.tea-ebook.com">Tea</a>, <a href="http://www.pmsipilot.com">PMSIpilot</a>, <a href="http://www.doyoubuzz.com/fr/">DoYouBuzz</a>, <a href="http://atipik.fr">Atipik</a>, <a href="http://verylastroom.com">VeryLastRoom</a> ou <a href="http://www.plemi.com">Plemi</a>, et si c’est le cas, c’est qu’elles ont jugé qu’atoum pouvait leur faire gagner de l’argent.</p>
<p>Il parait même que <a href="https://twitter.com/gdelamarre">certain</a>s donnent des formations sur <a href="http://www.atoum.org/atoum">atoum</a> ou <a href="https://twitter.com/ludofleury/status/309338528557461505">trouve un poste</a> grâce à lui.</p>
<p>J’ai même été le salarié de l’une d’elles, même si j’ignore totalement si <a href="http://www.atoum.org/atoum">atoum</a> a joué un rôle significatif dans mon recrutement.</p>
<p>Et aujourd’hui, quelles sont mes motivations ?</p>
<p>J’avoue qu’elles n’ont pas évolué d’un iota et j’espère poursuivre l’aventure encore longtemps, d’autant que j’ai le contrôle absolu pour le meilleur et pour le pire et que cela me permet d’évacuer une certaine tension induite par mon travail.</p>
<p>En effet, professionnellement, la plupart de mes actes me sont dictés par ma hiérarchie et des contraintes commerciales et économiques.</p>
<p>Et parfois, j’ai énormément de mal à l’accepter, car ce que l’on m’impose va à l’encontre des bonnes pratiques techniques et m’empêche donc de faire mon travail correctement, du moins de mon point de vue.</p>
<p>Cela provoque alors chez moi de l’énervement et du stress qui m’empêche de m’éclater réellement dans le cadre de mon travail.</p>
<p>Par contre, ce n’est pas le cas dans le cadre d’<a href="http://www.atoum.org/atoum">atoum</a> et ce projet est donc devenu rapidement un exutoire, car il me permet de travailler comme je l’entends sur des sujets qui me passionnent en suivant mes propres règles et contraintes.</p>
<p>En effet, s’il y a parfois des discussions houleuses parmi la communauté, ce ne sont pas des ordres imposés arbitrairement sans aucune réflexion technique sous-jacente, mais au contraire des débats constructifs et argumentés qui mènent toujours à une action positive.</p>
<p>Encore une fois, mon investissement, mon don pour paraphraser <a href="https://github.com/fzaninotto">François</a>, n’est donc pas désintéressé.</p>
<p>Je suis donc bien obligé de reconnaître que son analyse est finalement très pertinente, même si j'aurais aimé être plus altruiste dans ma démarche !</p>http://blog.mageekbox.net/?post/2013/04/16/Pourquoi-atoum-est-il-open-source#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/419À propos de atoum #2urn:md5:4f06e0fecdf9f8660349a1bd2f26bb562013-04-12T14:00:00+02:002013-04-15T09:20:29+02:00mageekguyatoumatoumPHP SolutionsPHPUnittests unitaires<p>Lentement mais surement, <a href="http://www.atoum.org/atoum">atoum</a> poursuit son bonhomme de chemin.</p>
<p>Il vient en effet de se voir attribuer 375 étoiles sur <a href="https://github.com/atoum/atoum">github</a> et sa communauté d’utilisateurs s’agrandie de jour en jour.</p>
<p><img src="http://blog.mageekbox.net/public/atoum/atoum375.png" alt="375 stars for atoum" style="margin: 10px auto; display: block; " title="375 stars for atoum, avr. 2013" /></p>
<p>Vous êtes en effet de plus en plus nombreux à fréquenter plus ou moins régulièrement ##atoum, le canal <abbr title="Internet Relay Chat">IRC</abbr> du projet hébergé par le réseau <a href="http://webchat.freenode.net">Freenode</a>.</p>
<p>De plus, les développements basés sur <a href="http://www.atoum.org/atoum">atoum</a> sont également de plus en plus nombreux, notamment ceux utilisant Symfony 2 grâce au travail effectué sur <a href="https://github.com/atoum/AtoumBundle">l’AtoumBundle</a> par certains contributeurs du projet.</p>
<p>Certains m’ont d’ailleurs demandé la raison pour laquelle il n’y avait pas eu de conférence au sujet d’<a href="http://www.atoum.org/atoum">atoum</a> lors du dernier <a href="http://paris2013.live.symfony.com">Symfony Live</a>.</p> <p>Régulièrement, j’ai également des retours sur son utilisation en entreprise grâce à la publication de <a href="http://news.humancoders.com/t/php/items/1729-presentation-d-atoum-lors-du-sfpot-marseille">supports</a> de <a href="http://fr.slideshare.net/SbastienHOUZ/very-lastroom-symfony1-vers-symfony2-en-douceur">conférences</a>, de billets de blog ou au cours d’une conversation à la fin d’une conférence.</p>
<p>J’ai ainsi appris qu’<a href="http://www.atoum.org/atoum">atoum</a> était utilisé par exemple par <a href="http://tech.m6web.fr/integration-continue-avec-jenkins-et-atoum">M6 Web</a>, <a href="http://www.mozfr.org">Mozilla</a>, Orange, <a href="http://www.tea-ebook.com">Tea</a>, <a href="http://www.pmsipilot.com">PMSIpilot</a>, <a href="http://www.doyoubuzz.com/fr/">DoYouBuzz</a>, <a href="http://atipik.fr">Atipik</a> ou <a href="http://verylastroom.com">VeryLastRoom</a>.</p>
<p>Autre signe encourageant, il y a de plus en plus d’avis publiés à son sujet sur des <a href="http://www.phptherightway.com">sites de références</a> tel que celui de <a href="http://fr.clever-age.com/veille/publications/fiches-produits/atoum.html">Cleverage</a>.</p>
<p><a href="https://packagist.org/packages/atoum/atoum">Packagist</a> indique lui qu’<a href="http://www.atoum.org/atoum">atoum</a> a été installé plus de 7200 fois depuis novembre 2012, date à laquelle les statistiques ont été réinitialisées à la suite de création de <a href="http://blog.mageekbox.net/?post/2012/11/21/L-un-de-mes-b%C3%A9b%C3%A9s-a-quitt%C3%A9-la-maison-%21">l’organisation</a> <a href="http://www.atoum.org/atoum">atoum</a> sur github et le déplacement du dépôt correspondant.</p>
<p><a href="http://about.travis-ci.org">Travis</a>, de son côté, ne donne aucune statistique concernant le taux d’utilisation d’<a href="http://www.atoum.org/atoum">atoum</a>, mais il indique <a href="http://about.travis-ci.org/fr/docs/user/languages/php/">comment l’utiliser</a> depuis longtemps.</p>
<p>Par ailleurs, de <a href="http://www.24joursdeweb.fr/2012/le-renouveau-de-php/">nouveaux</a> <a href="http://www.blog-nouvelles-technologies.fr/archives/18047/partie-2-10-conseils-pour-mieux-coder-en-php/">billets</a> de <a href="http://testonsteroid.tumblr.com/post/20176732842/php-unit-testing-with-atoum">blog</a> sont publiés régulièrement par des <a href="http://rebolon.tumblr.com/post/44208304360/atoum-et-une-classe-codee-en-php-5-2">utilisateurs</a> et il existe même des <a href="http://rpm.pbone.net/index.php3/stat/4/idpl/20476573/dir/fedora_1/com/atoum-0-0.2.gitdbfb82f.fc19.noarch.rpm.html">paquets binaires</a> pour l’installer en quelques instants sur votre UNIX favori.</p>
<blockquote cite="http://www.24joursdeweb.fr/2012/le-renouveau-de-php/"><p>Le testing fourmille d'excellents outils comme atoum, framework ayant pour but de rendre les tests unitaires simples et rapides</p>
</blockquote>
<p>Autre signe positif, des éditeurs d’<abbr title="Integrated Development Environment">IDE</abbr> tel que <a href="http://youtrack.jetbrains.com/issue/WI-11602">Jetbrain</a> ou <a href="https://github.com/atoum/atoum/issues/171">Netbeans</a> ont commencé à travailler sur l’intégration d’<a href="http://www.atoum.org/atoum">atoum</a> au sein de leur logiciel.</p>
<p>De plus, si sa <a href="http://docs.atoum.org">documentation</a> était autrefois le point faible du projet, elle a beaucoup évolué grâce au travail remarquable de notre <a href="https://twitter.com/marmotz">marmotte</a>. </p>
<p>Et même si elle est encore incomplète, elle couvre cependant la grande majorité des besoins et elle est <a href="http://rchea.com/1ere-contribution-open-source/">enrichie continuellement</a>.</p>
<p>Enfin, <a href="http://www.atoum.org/atoum">atoum</a> a généré une espèce de synergie entre plusieurs projets PHP francophones.</p>
<p>Sa <a href="http://docs.atoum.org">documentation</a> est ainsi basée sur <a href="http://markup.skriv.org">SkrivML</a>, un langage dérivé du Markdown et du Creole par <a href="https://twitter.com/geekcto">Amaury Bouchard</a>. </p>
<p>Ivan Enderlin travaille quant à lui actuellement pour intégrer dans <a href="http://www.atoum.org/atoum">atoum</a> une technologie novatrice relative aux tests logiciels faisant partie de <a href="http://hoa-project.net">Hoa</a>, son ensemble de bibliothèques pour PHP.</p>
<p>Le succès semble donc être au rendez-vous, malgré le fait qu’<a href="http://www.atoum.org/atoum">atoum</a> soit utilisable uniquement avec PHP 5.3 alors que cette version est loin d’être la plus utilisée et que PHPUnit était le standard « de fait » pour faire des tests unitaires en PHP depuis maintenant plusieurs années.</p>
<p>Le fait qu’<a href="http://www.atoum.org/atoum">atoum</a> ait été conçu pour simplifier la vie du développeur, améliorer sa productivité et lui rendre l’écriture d’un test unitaire sinon agréable au moins plus facile n’y est certainement pas étranger.</p>
<p>Il permet en effet d’écrire très rapidement des tests lisibles et donc facile à maintenir grâce à une mise en œuvre simple, une interface fluide permettant la rédaction des tests en langage quasi naturel, un système de <a href="https://gist.github.com/wowo/1331789">bouchonnage très puissant et innovant</a> et une configuration minimale et facile à mettre en œuvre. </p>
<p>De plus, il offre une grande fiabilité et une vitesse d’exécution sans pareil grâce à l’isolation native des tests et à la parallélisation de leur exécution, </p>
<p>Enfin, grâce à une API cohérente et naturelle, il permet de rédiger un test sans devoir s’interroger sur le fonctionnement d’<a href="http://www.atoum.org/atoum">atoum</a>, de l’exécuter efficacement et facilement et il peut être utilisé aussi bien avec Symfony 2, le Zend Framework ou tout autre framework.</p>
<p>Alors, quand testez-vous <a href="http://www.atoum.org/atoum">atoum</a> ?</p>
<blockquote cite="https://twitter.com/marmotz/status/322343483568439296"><p>Allo !? Non mais allo quoi ! Tu fais des TU et tu utilises pas #atoum ? C'est comme si je te dis "t'es dev et t'as pas de doigts", quoi !</p>
</blockquote>http://blog.mageekbox.net/?post/2013/04/12/A-propos-de-atoum-2#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/418Une petite énigme ?urn:md5:20cfbdff55306c0eca2bec6bcf6680402013-03-07T13:30:00+01:002013-03-07T15:08:42+01:00mageekguyPHPatoumautoloadphpwindowsénigme<p>Ça vous dis d'essayer de résoudre une énigme en <a href="http://www.php.net">PHP</a> sur laquelle je me casse les dents depuis deux jours maintenant ?</p>
<p>Il s’agit d’une énigme complexe et à tiroir qui aurait pu être posée par une sorcière vaudou habitant au fin fond du bayou, une de ces énigmes qui semblent simples, mais qui sont pourtant incroyablement complexes à résoudre, du moins tant que l’on n’a pas trouvé la pourtant si incroyablement évidente solution. </p> <p>Il s’agit d’un bug dans <a href="http://www.atoum.org/atoum">atoum</a> qui ne se produit que sous Windows et uniquement avec le code contenu dans la branche « autoloader ».</p>
<p>Il y a quelques jours, j’ai cherché une solution pour rendre insensible à la casse le mécanisme d’auto-chargement de classe d’<a href="http://www.atoum.org/atoum">atoum</a> (l’objectif recherché ainsi que les raisons historiques du fonctionnement actuel sont hors de propos).</p>
<p>Pour y parvenir, j’ai donc fait en sorte que la méthode <a href="https://github.com/atoum/atoum/blob/autoloader/classes/autoloader.php#L70"><code>atoum\autoloader::addDirectory()</code></a> parcourt chaque répertoire qu’elle reçoit en argument pour construire un tableau de correspondance entre un nom de classe et un chemin d’accès sur le système de fichier, tableau qui est ensuite utilisé pour localiser et charger à l’aide de <code>require</code> le fichier contenant la classe requise par le fonctionnement du programme.</p>
<p>Évidemment, ce parcourt a un impact sur les performances, et dans le cas d’<a href="http://www.atoum.org/atoum">atoum</a>, il est très important, car chaque méthode de test est exécutée par défaut dans un processus PHP différent.</p>
<p>En conséquence, avec une implémentation trop naïve de ce mécanisme, les répertoires concernés sont donc parcourus pour chaque méthode de test, ce qui est coûteux et surtout complètement inutile.</p>
<p>J’ai donc modifié le moteur qui exécute chaque méthode de test de façon à ce qu’il transmette le tableau évoqué précédemment au processus PHP concerné pour supprimer ce trop coûteux et parfaitement inutile parcours de répertoire.</p>
<p>Pour cela, j’ai tout simplement passé en argument à la fonction <code>var_export()</code> l’objet responsable de l’autochargement de classe dans atoum et j’ai <a href="https://github.com/atoum/atoum/blob/autoloader/classes/test/engines/concurrent.php#L141">envoyé le résultat</a> au processus PHP via un <a href="http://en.wikipedia.org/wiki/Pipeline_(Unix)">pipeline</a> ouvert à l’aide de la fonction <a href="http://www.php.net/proc_open"><code>proc_open()</code></a>.</p>
<p>Sous UNIX, tout a alors fonctionné sans le moindre problème et j’ai obtenu des performances tout à fait similaires à celles obtenues avec l’ancienne version du mécanisme d’autochargement de classe.</p>
<p>Par contre, les tests effectués par thehawk (que je remercie grandement encore une fois pour sa patience), l’un des contributeurs à atoum utilisant Windows, ont révélé un problème.</p>
<p>En effet, il obtient systématiquement le message d’erreur suivant lorsqu’il exécute la commande <code>php ./bin/atoum --test-it</code> permettant d’exécuter l’intégralité des tests unitaires de atoum :</p>
<blockquote><pre><code>ERROR: PHP Parse error: syntax error, unexpected ''O:26:"mageekguy\atoum\autoloa' (T_ENCAPSED_AND_WHITESPACE), expecting ')' in - on line 1</code></pre></blockquote>
<p>Évidemment, nous avons fait quelques vérifications et je peux déjà vous dire que :</p>
<ul>
<li>Le code transmis au processus PHP est bien un code PHP syntaxiquement valide, car l’utilisation de la commande <code>php -l</code> l’a confirmé.</li>
<li>Le code transmis au processus PHP est parfaitement exécutable et génère le résultat escompté sous Windows comme sous UNIX lorsqu’il est mis dans un fichier et exécuté en ligne de commande à l’aide de <code>php path/to/file.php</code>.
</li>
<li>Le code généré sous Windows et envoyé au processus PHP s’exécute sans le moindre problème sous UNIX, si ce n’est qu’évidemment les chemins d’accès aux classes sont invalides et que cela provoque une erreur lors de l’inclusion des fichiers.</li>
<li>Le responsable de l’erreur de syntaxe semble se cacher dans le contenu de la propriété <code>classes</code> de la classe <code>atoum\autoloader</code>.
</li>
</ul>
<p>Pour obtenir ces informations, j’ai notamment remplacé l’appel à la fonction <code>var_export()</code> par un appel à la fonction <code>serialize()</code>.</p>
<p>J’ai de plus implémenté l’interface <code>serializable</code> au niveau de la classe <code>atoum\autoloader</code> afin de pouvoir <a href="https://github.com/atoum/atoum/blob/autoloader/classes/autoloader.php#L32">contrôler finement</a> ce qu’il se passe lorsqu’une de ses instances est passée en argument à <code>serialize()</code>.</p>
<p>Pour autant, je n’ai aucune idée de l’origine du problème qui semble être lié à l’utilisation de <code>proc_open()</code> puisque l’erreur de syntaxe ne se manifeste que dans ce contexte.</p>
<p>Je subodore que les <code>\</code> utilisés dans les chemins de fichier sous Windows sont responsable, mais je n’ai pas réussi à en avoir la preuve.</p>
<p>Et j'ai encore plus étrange, si jamais cela ne vous suffit pas, puisque l'ajout d'un <code>print_r($this->classes)</code> dans le code de la méthode <code>atoum\autoloader::serialize()</code> fait <a href="http://pastebin.com/uBw0c0h1">disparaître l'erreur de syntaxe</a>.</p>
<p>Donc, si vous êtes amateur de prise de tête, que vous êtes sous Windows et que vous plonger dans les rouages de atoum ne vous effraye pas le moins du monde, je vous invite à <a href="https://github.com/atoum/atoum">forker le dépôt d’atoum</a>, à vous positionner sur <a href="https://github.com/atoum/atoum/tree/autoloader">la branche « autoloader »</a> et à tenter de résoudre cette énigme.</p>
<p>Et si d’aventure vous trouvez la solution et surtout l’explication, je vous invite à la partager ici en commentaire ou bien en tout autre lieu que vous jugerez adéquat.</p>
<p>Et si vous voulez des informations supplémentaires, je vous propose de me les demander soit en commentaire, soit plus simplement sur le canal <abbr title="Internet Relay Chat">IRC</abbr> officiel d’atoum, à savoir <code>##atoum</code> sur le réseau Freenode.</p>
<p>Et j’ai failli oublier le plus important : <privatejoke>pour ceux qui ne saurait pas encore, <a href="http://www.atoum.org/atoum">atoum</a> est un framework de test unitaire, simple, moderne et intuitif !</privatejoke></p>http://blog.mageekbox.net/?post/2013/03/07/Une-petite-%C3%A9nigme#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/405Il faut nettoyer la merde rapidement !urn:md5:186e4b4079298100d033c5d01b5ba7852013-02-01T14:00:00+01:002013-02-01T15:14:09+01:00mageekguyPHPatoumBehatCoconutCrewJenkinsPHPPHPUnitTravis<p>Je lis du code.</p>
<p>Je lis même énormément de code, évidemment en <a href="http://www.php.net">PHP</a> mais également écrit avec d'autres langages.</p>
<p>J’irais même jusqu’à dire que j’en lis beaucoup plus que j’en écris.</p>
<p>Et si parfois, je lis du code impressionnant, beau et efficace, parfois, je lis des choses comme ce qui suit…</p> <p>Je vais commencer doucement, avec certainement le code le plus (in) utile que j’ai pu voir jusqu’à maintenant :</p>
<blockquote><pre><code>if (0) {
/* beaucoup de code très compliqué */
}
</code></pre></blockquote>
<p>J’ai une affection très particulière avec l’extrait suivant, que je trouve très mignon :</p>
<blockquote><pre><code>try { return true; }
catch (exception $ exception) {
/* beaucoup de code très compliqué */
}
</code></pre></blockquote>
<p>Je poursuivrais avec un grand classique qu’il est possible de retrouver dans quasi tous les langages supportant cette structure :</p>
<blockquote><pre><code>switch ($ value) {
case/*… */:
break ;
default:
/*… */
break; // extrémement utile voir indispensable…
}
</code></pre></blockquote>
<p>Il arrive également que je tombe sur des choses de ce genre :</p>
<blockquote><pre><code>sprintf("'%s'", (string) $element);
</code></pre></blockquote>
<p>Et dernièrement, j'ai lu ceci :</p>
<blockquote><pre><code>function handle ($ foo = null) {if ($foo === null) return parent::handle() else return parent::handle($foo);}
</code></pre></blockquote>
<p>Bref, je trouve des perles, la liste est encore longue, et il serait possible d’en rire pendant très longtemps (et j’avoue que je ne m’en prive pas), sauf qu’au final ça n’apporte pas grand-chose.</p>
<p>En effet, à un moment ou un autre, indépendamment du langage et des outils que nous utilisons, nous faisons tous plus ou moins de la merde.</p>
<p>Elle colle plus ou moins à la cuvette et sent plus ou moins fort en fonction de nos compétences et de notre expérience (et ce n’est pas forcément celle du plus inexpérimenté qui est la plus nauséabonde), mais ça reste de la merde.</p>
<p>Et si nous sommes souvent totalement responsables du merdier que nous laissons derrière nous, parfois, ce n’est pas le cas.</p>
<p>Parfois, cette merde peut être le résultat de l’infection de votre commercial ou de votre supérieur par des agents pathogènes extérieurs encore plus puissants que ceux de la gastro-entérite et qui les poussent à vous imposer des délais impossibles à tenir et vous oblige donc à rogner sur la qualité en faisant les choses à l’arrache.</p>
<p>Parfois, le code dont vous avez la charge a des années d’existence et il est le fruit du travail de plusieurs développeurs qui ont laissé leur quota de merde dans le code.</p>
<p>Et vous êtes obligé de l’accepter, car vous ne voulez pas ou vous ne pouvez pas tirer la chasse.</p>
<p>Alors, que faire pour éviter cela ?</p>
<p>Je n’ai pas LA réponse à cette question, car il faudra de toute façon que la chasse soit tirée un jour ou l’autre, mais je peux par contre vous dire qu’il vaut mieux le faire le plus rapidement possible.</p>
<p>Car plus vous attendez pour le faire, plus la merde s’incruste dans la cuvette et plus elle sera difficile à enlever.</p>
<p>Le nettoyage vous prendra donc de plus en plus de temps et vous coûtera donc de plus en plus cher.</p>
<p>Et dans le pire des cas, à un moment, la merde submergera l’intégralité de votre code et compromettra très sérieusement son bon fonctionnement et sa maintenance.</p>
<p>Le plus raisonnable est donc de nettoyer la merde au plus tôt, ou, pour utiliser un vocabulaire un peu moins fleuri, de réduire la dette technique de votre code le plus rapidement possible.</p>
<p>Et pour cela, je vous recommande deux chose : effectuez des revues de code régulières et écrivez des tests unitaires ou fonctionnels exécutables par la machine (et souvenez-vous que les tests fonctionnels sont complémentaires des tests unitaires, et non exclusifs).</p>
<p>Les revues de code vous permettront en effet de détecter au plus tôt les problèmes dans votre code et donc de les corriger pour un coût minime vu qu’ils n’auront pas encore eu de conséquences.</p>
<p>Les tests vous permettront quant à eux de vérifier facilement que les corrections effectuées sur le code à la suite d’une revues de code n’ont pas altéré significativement son fonctionnement.</p>
<p>En effet, si grâce à eux vous ne pourrez peut-être pas détecter tous les problèmes, vous pourrez cependant être certain que le code corrigé se comporte toujours de la même façon dans le cadre des tests (et uniquement dans ce cadre et avoir de tels tests ne vous dispensent donc pas d’effectuer des tests manuels).</p>
<p>De plus, comme ils sont exécutés par la machine, ils sont réalisés exhaustivement et surtout bien plus efficacement que s’ils étaient effectués par l’Humain, ce qui permet de valider le fonctionnement du code également à moindre coût.</p>
<p>Alors, si vous souhaitez suivre mes conseils, je vous recommande <a href="http://fr.slideshare.net/JMF/revues-de-code-forum-php-2010">l’'excellente conférence de Jean-Marc Fontaine</a> concernant les revues de code, ainsi que <a href="https://github.com/pmsipilot/Crew">Crew</a> qui vous simplifiera le processus si vous utilisez <a href="http://git-scm.com">Git</a> pour gérer votre dépôt de codet.</p>
<p>Et en ce qui concerne la mise en œuvre de tests unitaires ou fonctionnels, je vous recommande de vous intéressez à des outils tels qu’<a href="http://www.atoum.org/atoum">atoum</a>, <a href="https://github.com/sebastianbergmann/phpunit/">PHPUnit</a> ou <a href="http://behat.org">Behat</a> ainsi qu’à des outils d’intégration continue tels que <a href="http://jenkins-ci.org">Jenkins</a> ou <a href="https://travis-ci.org">Travis</a>.</p>http://blog.mageekbox.net/?post/2013/02/01/Il-faut-nettoyer-la-merde-rapidement#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/397Modifier un espace de nom sans casser la rétro-compatibilitéurn:md5:ffb7a88ea259ec0ea9faf6ca503210c22013-01-17T14:00:00+01:002013-01-18T23:09:34+01:00mageekguyatoumatoumPSR-0<p>À l'origine, l'espace de nom de <a href="http://www.atoum.org/atoum">atoum</a> (non, je ne dirais pas qu'il s'agit d'un framework de tests unitaires simple, moderne et intuitif pour PHP ≥ 5.3, et non, je ne l'ai pas dit, je l'ai écris) devait être tout simplement <code>atoum</code>.</p>
<p>Et puis, un jour, un truc qui s’appelait à l’époque le <q>PHP Working Group</q> a pondu un truc appelé <a href="https://gist.github.com/1234504">PSR-0</a>, une recommandation visant à favoriser l’interopérabilité entre des projets différents en définissant une norme concernant la nomenclature à utiliser pour nommer à la fois les espaces de nom et les classes PHP, afin de normaliser le mécanisme d’autochargement.</p>
<p>À l’époque, l’idée m’avait paru excellente et comme par nature atoum était destiné à être utilisé dans des projets divers et variés, j’ai décidé de suivre la recommandation PSR-0 et de modifier son espace de nom en <code>mageekguy\atoum</code> afin de suivre le modèle <code>vendor\project</code>.</p>
<p>À l’époque, cela avait été facile, car le nombre de fichiers composant le projet était relativement modeste, et de plus, je n’avais pas à assurer une quelconque rétrocompatibilité puisque j’étais son seul utilisateur.</p>
<p>La modification a donc été simple et rapide et atoum a été rendu public avec cet espace de nom et il a commencé à être utilisé par de plus en plus de personnes et aussi bien dans un cadre personnel que professionnel.</p>
<p>Et j’ai alors commencé à avoir des remarques concernant son espace de nom et plus précisément à propos du fait qu’il était un peu trop lié à ma personne, et qu’en conséquence, ça ne faisait pas très sérieux, ou du moins pas suffisamment pour favoriser l’utilisation du projet en entreprise.</p>
<p>Sur le moment, je n’y ai pas accordé d’importance et j’ai alors subit un lobbying suffisamment puissant pour que lors de ma conférence <a href="http://blog.mageekbox.net/?post/2012/06/08/Le-forum-PHP-2012%2C-c-est-termin%C3%A9-%21">au dernier Forum PHP</a>, je demande à mon public de choisir entre <code>mageekguy\atoum</code> et <code>atoum\</code>.</p>
<p>Et le public a choisi <code>atoum\</code>.</p> <p>Or, si à l’époque la transition de <code>atoum\</code> vers <code>mageekguy\atoum</code> a été facile, elle n’était plus aussi simple presque deux ans après.</p>
<p>Tout d’abord, le nombre de fichiers du projet avait grandement augmenté, et de plus l’espace de nom apparaît massivement dans son code, tant au niveau de la définition des classes que dans mes tests, et aussi bien sous la forme d’une chaîne de caractères que sous la forme d’une instruction PHP.</p>
<p>Malgré l’existence de plus de 16 000 assertions réparties dans presque 150 classes de test et plus de 1000 méthodes, le risque était donc grand d’introduire un bug dans le code en effectuant la modification nécessaire.</p>
<p>De plus, depuis la publication de <a href="http://www.atoum.org/atoum">atoum</a>, j’attache une grande importance au fait d’assurer dans la mesure du possible et du raisonnable une rétrocompatibilité maximum.</p>
<p>Je devais donc trouver une solution pour que ce changement d’espace de nom ait un impact minimum, voire nul, sur les utilisateurs du projet.</p>
<p>Et j’ai eu l’idée d’utiliser le mécanisme d’autochargement de classe d’<a href="http://www.atoum.org/atoum">atoum</a> pour y parvenir.</p>
<p>En effet, si j’avais décidé de suivre la règle de nommage préconisée par PSR-0 concernant les classes d’un projet, je n’ai pas pour autant mis en place un mécanisme d’autochargement compatible avec cette dernière.</p>
<p>J’étais donc libre de le modifier pour lui permettre de créer à la volée lors de l’exécution des tests les classes nécessaires dans l’espace de nom atoum\ afin de remplacer celles définies dans l’espace de nom mageekguy\atoum.</p>
<p>J’ai donc introduit la notion d’alias d’espace de nom dans atoum, ce qui m’a permis de définir l’alias atoum\ pour l’espace de nom mageekguy\atoum.</p>
<p>Ainsi, lorsqu’une classe est requise dans le nouvel espace de nom, comme par exemple <code>atoum\test</code>, <a href="http://www.atoum.org/atoum">atoum</a> commence par <a href="https://github.com/atoum/atoum/blob/master/classes/autoloader.php#L144">résoudre l’alias correspondant</a> et transforme donc le nom de la classe demandée en <code>mageekguy\atoum\test</code>.</p>
<p>Il est alors à même de localiser le fichier correspondant, de l’inclure et de créer, cette fois au niveau du moteur de PHP, l’alias correspondant à l’aide de la fonction <code><a href="http://fr2.php.net/manual/fr/function.class-alias.php">class_alias()</a></code>.</p>
<p>Ainsi, une même classe peut exister sous deux noms différents sans le moindre problème et non seulement les utilisateurs d’atoum ne sont pas obligés de modifier leurs tests pour utiliser le nouvel espace de nom, mais en plus, ils sont libres d’utiliser celui de leur choix.</p>
<p>Et cerise sur le gâteau, l’impact sur les performances est négligeable.</p>
<p>De plus, le jour ou nous aurons le temps, nous pourrons effectivement modifier dans le code et les tests du projet l’espace de nom mageekguy\atoum en atoum\, et nous n’aurons plus ensuite à faire de mageekguy\atoum un alias de atoum\ afin de conserver la rétrocompatibilité.</p>
<p>Pour l’instant, le seul inconvénient que j’ai pu trouver à cette solution est qu’elle n’est pas valable si des classes sont chargées explicitement par le développeur via <code>include</code> ou <code>require</code> mais j’aime à penser que cette pratique est plus que marginale et de toute façon, même dans ce cas, le code reste parfaitement fonctionnel si l’espace de nom <code>mageekguy\atoum</code> est utilisé.</p>
<p>Et rétrospectivement, je suis très heureux de ne pas avoir suivi <a href="https://gist.github.com/1234504">PSR-0</a> jusqu'au bout et d'avoir ainsi conservé la maîtrise totale du mécanisme de chargement de classe de <a href="http://www.atoum.org/atoum">atoum</a>.</p>http://blog.mageekbox.net/?post/2013/01/17/Modifier-un-espace-de-nom-sans-casser-la-r%C3%A9tro-compatibilit%C3%A9#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/394Bonne année 2013urn:md5:85189a9086db2578a65189208bc87dd22013-01-07T13:10:00+01:002013-01-10T13:54:21+01:00mageekguyRéfléxionsatoumPHPvœux<p>2012 vient de se terminer et il est donc temps qu'en bon agiliste j'en fasse la rétrospective et que je vous présente mes vœux.</p>
<p>Comme d'habitude depuis maintenant quelques années, cette nouvelle révolution autour du Soleil a été relativement mouvementée, aussi bien au niveau personnel que professionnel.</p> <p>D’un point de vue strictement personnel, il y a eu un nouveau déménagement (le cinquième en six ans) à la suite de l’achat d’une maison (approximativement la troisième en 8 ans), la naissance de ma seconde fille (mon quatrième enfant en sept ans).</p>
<p>Dans un registre un peu moins personnel, suite à son succès, <a href="http://www.atoum.org">atoum</a> n’est plus mon framework de tests unitaires simple, moderne et intuitif pour PHP ≥ 5.3 puisqu’il est maintenant indépendant de ma personne depuis la création par ses contributeurs d’une <a href="http://blog.mageekbox.net/?post/2012/11/21/L-un-de-mes-b%C3%A9b%C3%A9s-a-quitt%C3%A9-la-maison-%21">organisation Github dédiée</a>, qu’ils en soient une nouvelle fois ici remerciés.</p>
<p>Du coup, grâce à la naissance de cette communauté, 2012 a été une année riche en rencontres intéressantes, même si la plupart d’entre elles ne se sont pas (encore) concrétisées <abbr title="In Real Life">IRL</abbr>, même si j’ai pu rencontrer <a href="https://github.com/jubianchi">Julien Bianchi</a> à deux reprises pour mon plus grand plaisir.</p>
<p>J’ai par ailleurs donné en 2012 <a href="http://blog.mageekbox.net/?post/2012/12/07/Retour-sur-le-PHP-Tour-Nantais">trois</a> <a href="http://blog.mageekbox.net/?post/2012/06/08/Le-forum-PHP-2012%2C-c-est-termin%C3%A9-%21">conférences</a> concernant directement <a href="http://www.atoum.org">atoum</a> grâce à l’<a href="http://www.afup.org"><abbr title="Association Française des Utilisateurs de PHP">AFUP</abbr></a> et je profite donc de l’occasion pour présenter mes meilleurs vœux pour 2013 à cette association et la remercier pour le soutien très actif qu’elle apporte à <a href="http://www.php.net">PHP</a> en général et à atoum en particulier.</p>
<p>J’ai également donné une conférence plus généraliste concernant le test avec <a href="https://twitter.com/hoaproject">Ivan Enderlin</a> (le papa de <a href="http://hoa-project.net">Hoa</a>), toujours dans le cadre du Forum PHP et même si nous avons clairement manqué de préparation, je suis prêt à recommencer lorsqu’il le désire, car l’aventure fut très intéressante.</p>
<p>D’ailleurs, notre coopération ne s’est pas arrêtée à cette seule conférence et vous devriez en récolter les fruits au niveau d’atoum en 2013, mais je n’en dirais pas plus pour le moment.</p>
<p>2012 a également été l’année de publication <a href="http://blog.mageekbox.net/?post/2012/05/23/PHP-5-avanc%C3%A9">du premier livre</a> sur lequel mon nom figure sur la couverture et je tiens à remercier Cyril Pierre de Geyer et plus particulièrement <a href="http://eric.daspet.name">Éric Daspet</a> de m’avoir permis de participer à cette aventure.</p>
<p>L’expérience a en effet été enrichissante à tout point de vue et j’espère pouvoir la renouveler en 2013, même si encore une fois, le temps sera vraisemblablement un problème.</p>
<p>Techniquement, pour la première fois depuis pas mal de temps, j’ai utilisé d’autres langages que <a href="http://www.php.net">PHP</a> comme <a href="https://github.com/mageekguy/jquery.miller.js">JavaScript</a> et <a href="https://github.com/mageekguy/BinaryClock">Objective-C</a>, et j’ai même rendu public mon code.</p>
<p>Non pas que j’ai succombé à la mode du « PHP bashing », mais j’ai eu l’envie de faire au moins temporairement autre chose et de me changer les idées.</p>
<p>Ce blog a également été un motif de satisfaction en 2012 puisque je parviens contre vents et marées à tenir un rythme de publication relativement soutenu (plus de 70 billets publiés sur l’année) et que sa fréquentation est toujours en hausse (d’environ 16 % d’après mes statistiques) alors que ma ligne éditoriale a quelque peu évolué au cours des douze derniers mois.</p>
<p>Vous qui me lisez, je vous remercie donc de votre fidélité.</p>
<p>D’un point de vue professionnel, le fait le plus remarquable de l’année 2012 est que je n’ai pas changé de travail et j’espère bien faire de même en 2013, mais tout n’a pas été rose pour autant.</p>
<p>En effet, pour de multiples raisons, je ne suis toujours pas parvenu à obtenir l’esprit d’équipe que je recherche et j’avoue qu’actuellement, je suis un peu à court d’idées qui me permettrait d’atteindre cet objectif.</p>
<p>Cela est d’autant plus paradoxal qu’à contrario, il règne parmi les contributeurs d’atoum et plus particulièrement sur son canal <abbr title="Internet Relay CHat">IRC</abbr> ##atoum sur le réseau <a href="http://webchat.freenode.net">Freenode</a> l’ambiance que j’aimerais avoir au bureau au quotidien.</p>
<p>Alors je sais très bien que je m’y suis certainement mal pris à un moment ou un autre avec mes développeurs, mais j’ai l’impression qu’il y a bien trop de passifs à un certain nombre de niveaux et à propos de choses sur lesquelles je n’ai aucun contrôle pour que je parvienne à réaliser mes ambitions à ce niveau un jour.</p>
<p>De plus, je n’ai pas réussi à mener à bien la principale mission qui m’avait été confiée et même si j’estime ne pas en être totalement responsable, j’avoue l’avoir assez mal vécu.</p>
<p>Pour autant, j’ai donc un nouveau challenge à relever, et s’il est beaucoup moins sexy techniquement parlant, les problématiques qu’il pose sont par contre tout aussi complexes, voir même plus.</p>
<p>Au final, je ne regrette pas grand-chose, même si j’aurais certainement pu faire mieux dans certains domaines si je m’étais un peu plus impliqué, car tout ceci me permet d’espérer une année 2013 passionnante.</p>
<p>Ainsi, j’espère qu’atoum va continuer sur sa lancée et être de plus en plus utilisé, ou du moins, je vais tout faire pour que cela arrive.</p>
<p>Je vais également continuer à proposer des conférences, en France ainsi qu’à l’étranger et je vais également essayer de diversifier mes sujets à ce niveau.</p>
<p>En effet, j’ai parlé quasi exclusivement d’<a href="http://www.atoum.org">atoum</a> en 2012 et j’ai maintenant envie de laisser ce sujet à d’autres (et mon petit doigt m’a dit qu’il y avait déjà des projets dans ce sens chez certains) et de parler d’autres choses, même si le test restera certainement l’un de mes sujets de prédilection.</p>
<p>Techniquement, je pense que je vais continuer quelque temps à faire autre chose que du PHP, en fonction de mes disponibilités, car j’ai vraiment besoin de faire autre chose actuellement.</p>
<p>Et au niveau de ce blog, j’espère faire au moins aussi bien que 2012 en 2013 et peut-être même à trouver le temps de refondre son thème.</p>
<p>Enfin, je vais regarder ma (grande) famille grandir dans ma nouvelle maison et essayer d’en profiter au maximum, car je suis bien placé pour savoir que toutes les bonnes choses ont une fin et qu’il faut savoir en profiter au maximum tant qu’elles sont présentes.</p>
<blockquote><p>Carpe diem !</p>
</blockquote>
<p>2013 risque donc d’être une année encore plus intéressante que 2012 à tout point de vue, et je ne peux donc que vous souhaiter la même chose, avec la santé et le bonheur en prime (et pour le bonheur, je souhaite un supplément spécial à <a href="http://twitter.com/marmotz">ma marmotte préférée</a> qui le mérite largement quoiqu’elle en pense) !</p>http://blog.mageekbox.net/?post/2013/01/07/Bonne-ann%C3%A9e-2013#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/392