{"id":6402,"date":"2021-06-03T17:00:55","date_gmt":"2021-06-03T15:00:55","guid":{"rendered":"https:\/\/www.luklagroup.com\/sem-categoria\/tests-voyons-petit-voyons-unitaire\/"},"modified":"2021-06-03T17:00:55","modified_gmt":"2021-06-03T15:00:55","slug":"tests-voyons-petit-voyons-unitaire","status":"publish","type":"post","link":"https:\/\/www.luklagroup.com\/pt-pt\/apps-data-pt-pt\/tests-voyons-petit-voyons-unitaire\/","title":{"rendered":"Tests : voyons petit, voyons unitaire"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong><em>Dans cette nouvelle s\u00e9rie d&#8217;articles, plus orient\u00e9e vers la technique et le processus de d\u00e9veloppement, Fran\u00e7ois nous partage sa rencontre et ses r\u00e9flexions avec les tests.<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em> Cette r\u00e9flexion comporte deux parties : <a href=\"https:\/\/digiwin.fr\/diginews\/ma-rencontre-avec-les-tests\/\" target=\"_blank\" rel=\"noreferrer noopener\">la d\u00e9couverte des enjeux de tests<\/a> et l&#8217;approche m\u00e9thodique de r\u00e9alisation, objet de cet article.<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Repartir sur de nouvelles bases pour r\u00e9aliser les tests<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comme je le disais dans mon article pr\u00e9c\u00e9dent, il fallait que je trouve une solution adapt\u00e9e au test de ma couche m\u00e9tier. <strong>Je m&#8217;\u00e9tais clairement tromp\u00e9 en choisissant les tests fonctionnels.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour commencer ce voyage initiatique, j&#8217;allais devoir retourner aux origines.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/e122151fc4bd8cd9e4417c62ee5081a48c394c953c169ce23afc11ceac45dbcd\/68747470733a2f2f6d656469612e67697068792e636f6d2f6d656469612f566e6c51707063437559526d6f2f67697068792e676966\" alt=\"Indiana Jones\" width=\"134\" height=\"84\" title=\"Indiana Jones\"\/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#les-l%C3%A9gendaires-tests-unitaires-\"><\/a>Les l\u00e9gendaires tests unitaires !<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tout le monde en parle mais que sont-ils r\u00e9ellement ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ils ont \u00e9t\u00e9 popularis\u00e9s par&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Kent_Beck\" target=\"_blank\" rel=\"noreferrer noopener\">Kent<\/a><a href=\"https:\/\/fr.wikipedia.org\/wiki\/Kent_Beck\"> Beck<\/a>&nbsp;et&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Erich_Gamma\" target=\"_blank\" rel=\"noreferrer noopener\">Erich Gamma<\/a>&nbsp;avec la cr\u00e9ation du framework JUnit en 1997. Puis remis au go\u00fbt du jour avec les m\u00e9thodes <strong>eXtreme Programming<\/strong> et <strong>Test Driven Development<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Malgr\u00e9 son apparente simplicit\u00e9, le <strong>test unitaire <\/strong>n&#8217;est pas facile \u00e0 d\u00e9finir. Beaucoup de d\u00e9veloppeurs se font leur propre id\u00e9e de ce qu&#8217;ils sont.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cependant, tout le monde s&#8217;accorde pour dire qu&#8217;<strong>un test est un proc\u00e9d\u00e9 s&#8217;assurant du bon fonctionnement d&#8217;un traitement<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant, voici une d\u00e9finition d&#8217;unit\u00e9 selon le Larousse :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;<em>Caract\u00e8re de ce qui est consid\u00e9r\u00e9 comme formant un tout dont les diverses parties concourent \u00e0 constituer un ensemble indivisibl<\/em>e.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>On peut en d\u00e9duire qu&#8217;un test unitaire doit s&#8217;assurer du bon fonctionnement d&#8217;un et d&#8217;un seul \u00e9l\u00e9ment.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette id\u00e9e s&#8217;oppose directement \u00e0 celle des tests fonctionnels qui testent l&#8217;application dans sa globalit\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le plus difficile reste \u00e0 venir : nous devons encore identifier cette unit\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Composer une application en unit\u00e9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En programation orient\u00e9e objet, de quoi est compos\u00e9e une application ? De,<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Packages,<\/li><li>Classes,<\/li><li>M\u00e9thodes,<\/li><li>Variables.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nous n&#8217;allons \u00e9videmment pas tester une variable car elle n&#8217;embarque aucune logique ni traitement. Quant au package, il parait trop vaste. Sa propre existence est li\u00e9e \u00e0 la notion de regroupement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Une unit\u00e9 peut donc \u00eatre soit une classe soit une m\u00e9thode, c&#8217;est une question de point de vue.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Et ce d\u00e9bat fait rage parmi les d\u00e9veloppeurs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Selon&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Martin_Fowler\" target=\"_blank\" rel=\"noreferrer noopener\">Martin Fowler<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>&#8220;(&#8230;)Despite the variations, there are some common elements. Firstly there is a notion that unit tests are low-level, focusing on a small part of the software system. Secondly unit tests are usually written these days by the programmers themselves using their regular tools. Thirdly unit tests are expected to be significantly faster than other kinds of tests.<br>So there&#8217;s some common elements, but there are also differences.<br>One difference is what people consider to be a unit. Object-oriented design tends to treat a class as the unit, procedural or functional approaches might consider a single function as a unit. But really it&#8217;s a situational thing &#8211; the team decides what makes sense to be a unit for the purposes of their understanding of the system and its testing. However you define it doesn&#8217;t really matter.(&#8230;)&#8221; <a href=\"https:\/\/martinfowler.com\/bliki\/UnitTest.html\" target=\"_blank\" rel=\"noreferrer noopener\">ref<\/a><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On peut en retenir :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Un test unitaire <\/strong>est un proc\u00e9d\u00e9 de bas niveau <strong>\u00e9crit par les d\u00e9veloppeurs<\/strong>, <strong>s&#8217;ex\u00e9cutant rapidement<\/strong> et <strong>s&#8217;assurant du bon fonctionnement<\/strong> d&#8217;une <strong>petite<\/strong> partie d&#8217;un syst\u00e8me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Dans le contexte qui m&#8217;int\u00e9resse, j&#8217;ai fait le choix qu&#8217;une classe de test \u00e9tait associ\u00e9e au test d&#8217;une classe m\u00e9tier (entit\u00e9 ou service) et qu&#8217;un test ne v\u00e9rifiait le bon fonctionnement que d&#8217;une seule de ses m\u00e9thodes.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#le-mod%C3%A8le-aaa\"><\/a>Le mod\u00e8le AAA<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Maintenant que nous avons une vision assez bonne de ce qu&#8217;est un test unitaire, comment l&#8217;\u00e9crire correctement ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arrange\/Act\/Assert<\/strong>&nbsp;(AAA) est un mod\u00e8le pour organiser son code dans une m\u00e9thode de test unitaire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;id\u00e9e est de d\u00e9velopper un test unitaire en suivant ces 3 \u00e9tapes simples :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Arrange<\/strong><br>Mise en place des pr\u00e9s-requis \u00e0 l&#8217;ex\u00e9cution du code test\u00e9 : donn\u00e9es d&#8217;entr\u00e9e et d\u00e9pendances.<\/li><li><strong>Act<\/strong><br>Ex\u00e9cution du code \u00e0 tester.<\/li><li><strong>Assert<\/strong><br>V\u00e9rification des crit\u00e8res de r\u00e9ussite du test.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un exemple volontairement simpliste avec le test de la m\u00e9thode pow (puissance) de la class Math de java :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Test\npublic void testPow() {\n    \/\/ Arrange\n    double base = 2d;\n    double exponent = 3d;\n\n    \/\/ Act\n    double result = Math.pow(base, exponent);\n\n    \/\/ Assert\n    assertEquals(8d, result);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Egalement, on trouve le mod\u00e8le&nbsp;<strong>Four Phase Test<\/strong>&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Setup<\/li><li>Exercise<\/li><li>Verify<\/li><li>Teardown<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Les 3 premiers points reprennent exactement les m\u00eames id\u00e9es que le mod\u00e8le AAA. Le dernier point &#8220;Teardown&#8221; est une \u00e9tape de d\u00e9montage permettant de remettre le syst\u00e8me dans l&#8217;\u00e9tat dans lequel il \u00e9tait avant l&#8217;ex\u00e9cution du test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Celui-ci me d\u00e9range beaucoup. Je trouve \u00e7a dangereux et compliqu\u00e9 qu&#8217;un simple test unitaire influe sur l&#8217;\u00e9tat global de mon syst\u00e8me. Et si mon test \u00e9choue ou plante, l&#8217;\u00e9tape de d\u00e9montage risque de ne pas \u00eatre ex\u00e9cut\u00e9e et pourra laisser mon syst\u00e8me dans un \u00e9tat incertain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Si vous \u00eates oblig\u00e9 de r\u00e9initialiser l&#8217;\u00e9tat de votre syst\u00e8me apr\u00e8s l&#8217;\u00e9xecution d&#8217;un test unitaire, remettez en cause votre test, vos donn\u00e9es d&#8217;entr\u00e9e et votre code.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Suis-je vraiment dans l&#8217;obligation de le faire ?<\/li><li>Ne suis-je pas en train d&#8217;\u00e9crire un test d&#8217;int\u00e9gration ?<\/li><li>N&#8217;ai-je pas une d\u00e9pendance maladroite ?<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#les-principes-first\"><\/a>Les principes FIRST<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voici quelques bonnes pratiques \u00e0 respecter.<br>Ces 5 principes peuvent constituer la base d&#8217;une checklist pour l&#8217;\u00e9criture d&#8217;un bon test unitaire.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#fast\"><\/a>1- Fast<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Un test unitaire se doit d&#8217;\u00eatre rapide (quelque ms). Mais, un d\u00e9veloppeur ne doit jamais h\u00e9siter \u00e0 lancer les tests car ils sont trop longs.<strong> La suite de tests doit pouvoir \u00eatre lanc\u00e9e \u00e0 chaque commit en int\u00e9gration, voir \u00e0 chaque sauvegarde en d\u00e9veloppement.<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#isolated\"><\/a>2- Isolated<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Les tests doivent pouvoir \u00eatre ex\u00e9cut\u00e9s dans n&#8217;importe quel ordre. Un test doit pouvoir \u00eatre lanc\u00e9 individuellement. Evitez les \u00e9tapes de d\u00e9montage qui peuvent masquer un probl\u00e8me de d\u00e9pendance centralis\u00e9e (comme une base de donn\u00e9es).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#repeatable\"><\/a>3- Repeatable<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Un test doit \u00eatre d\u00e9terministe. Le r\u00e9sultat doit toujours \u00eatre le m\u00eame quelque soit l&#8217;environnement et l&#8217;instant. Il ne devrait pas \u00eatre n\u00e9cessaire d&#8217;avoir un environnement sp\u00e9cifique aux tests. Chaque test doit pr\u00e9parer ses propres donn\u00e9es d&#8217;entr\u00e9e. Cr\u00e9ez une m\u00e9thode utilitaire si vous avez besoin de mutualiser leur cr\u00e9ation mais ne les centralisez pas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#self-verifying\"><\/a>4- Self-verifying<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Aucune \u00e9tape manuelle ne doit \u00eatre n\u00e9cessaire pour d\u00e9terminer si le test \u00e0 r\u00e9ussi ou \u00e9chou\u00e9.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#timely\"><\/a>5- Timely<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">En pratique, vous pouvez \u00e9crire des tests n&#8217;importe quand, mais le plus t\u00f4t sera le mieux.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#et-mes-d%C3%A9pendances-\"><\/a>Et mes d\u00e9pendances ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comme je l&#8217;ai d\u00e9j\u00e0 expos\u00e9, un bon test doit avoir des d\u00e9pendances minimales. Si un test en a beaucoup, demandez-vous si elles sont l\u00e9gitimes et remettez votre code en question.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsqu&#8217;il y a une justification de ces d\u00e9pendances, essayez de vous en abstraire au maximum. Un test doit v\u00e9rifier le bon fonctionnement d&#8217;un objet, pas de ses d\u00e9pendances. Gardez vos d\u00e9pendances sous contr\u00f4le de vos tests en les simulant \u00e0 travers d&#8217;instances que vous cr\u00e9ez dans vos tests ou de&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Mock_(programmation_orient%C3%A9e_objet)\" target=\"_blank\" rel=\"noreferrer noopener\">mocks<\/a>&nbsp;si ce n&#8217;est pas possible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#la-couverture\"><\/a>La couverture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La couverture de test est le taux de code couvert par les tests.<\/strong> Plus ce taux est \u00e9lev\u00e9, mieux c&#8217;est. Bien s\u00fbr, on aurait envie de courir apr\u00e8s le 100%. Mais est-ce n\u00e9cessaire ? Et m\u00eame atteint, ai-je vraiment test\u00e9 mon code dans tous les cas possibles ? Bien s\u00fbr que non.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alors quel est le bon taux ? Pour ma part, je pense qu&#8217;il doit simplement augmenter avec le temps. N&#8217;essayez pas de couvrir votre application en entier d\u00e8s le d\u00e9but, faites-le par petits incr\u00e9ments successifs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans un premier temps, vous pouvez vous focaliser <strong>sur les parties de votre application que vous jugez les plus critiques <\/strong>ou qui ont<strong> le plus de valeur ajout\u00e9e<\/strong>. Quand un bug est remont\u00e9 dans votre tracker, vous pouvez le couvrir par un test suppl\u00e9mentaire.<br>Et si vous atteignez <strong>75%<\/strong>, vous pouvez d\u00e9j\u00e0 \u00eatre fier de vous !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsque vous \u00e9crivez un test, vous pouvez utiliser des donn\u00e9es d&#8217;entr\u00e9e arbitraires, mais n&#8217;oubliez pas les valeurs remarquables (tout de suite, je pense \u00e0 la division par 0) ainsi que les bornes de votre syst\u00e8me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici ce qu&#8217;en dit Kent Beck sur Stack Overflow :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence (&#8230;) <a href=\"https:\/\/stackoverflow.com\/questions\/153234\/how-deep-are-your-unit-tests\/153565#153565\" target=\"_blank\" rel=\"noreferrer noopener\">ref<\/a><\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/voyons-petit-voyons-unitaire.md#mot-de-la-fin\"><\/a>Mot de la fin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ne sous-estimez pas vos tests. <\/strong>Ils doivent m\u00e9riter la m\u00eame attention que votre code et doivent \u00eatre expressifs. Si l&#8217;ajout d&#8217;un test n&#8217;est pas une op\u00e9ration triviale, n&#8217;h\u00e9sitez pas \u00e0 remettre en question votre code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Votre code doit \u00eatre facilement testable, pensez &#8220;Design for testability<\/strong>&#8220;.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cette nouvelle s\u00e9rie d&#8217;articles, plus orient\u00e9e vers la technique et le processus de d\u00e9veloppement, Fran\u00e7ois nous partage sa rencontre et ses r\u00e9flexions avec les tests. Cette r\u00e9flexion comporte deux parties : la d\u00e9couverte des enjeux de tests et l&#8217;approche m\u00e9thodique de r\u00e9alisation, objet de cet article. Repartir sur de nouvelles bases pour r\u00e9aliser les [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6403,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","footnotes":""},"categories":[183,184],"tags":[187],"class_list":["post-6402","post","type-post","status-publish","format-standard","has-post-thumbnail","category-apps-data-pt-pt","category-change-adopt-pt-pt","tag-developpement-pt-pt"],"_links":{"self":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/6402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=6402"}],"version-history":[{"count":0,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/6402\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/media\/6403"}],"wp:attachment":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=6402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=6402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=6402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}