{"id":6404,"date":"2021-06-03T16:58:23","date_gmt":"2021-06-03T14:58:23","guid":{"rendered":"https:\/\/www.luklagroup.com\/sem-categoria\/ma-rencontre-avec-les-tests\/"},"modified":"2021-06-03T16:58:23","modified_gmt":"2021-06-03T14:58:23","slug":"ma-rencontre-avec-les-tests","status":"publish","type":"post","link":"https:\/\/www.luklagroup.com\/pt-pt\/apps-data-pt-pt\/ma-rencontre-avec-les-tests\/","title":{"rendered":"Ma rencontre avec les tests"},"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 : la d\u00e9couverte des enjeux de tests, objet de cet article, et <a href=\"https:\/\/digiwin.fr\/diginews\/tests-voyons-petit-voyons-unitaire\/\" target=\"_blank\" rel=\"noreferrer noopener\">l&#8217;approche m\u00e9thodique de r\u00e9alisation<\/a> que vous trouverez dans le second article.<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Initiation aux tests de code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je me souviens du jour o\u00f9 j&#8217;ai d\u00e9couvert les tests.<br>Le concept m&#8217;a d&#8217;abord paru \u00e9trange.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><strong>Ecrire du code qui teste le code ?<\/strong><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une question stupide m&#8217;a travers\u00e9 l&#8217;esprit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><strong>Oui, mais alors, comment tester le code qui teste le code ?<\/strong><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puis, j&#8217;ai \u00e9t\u00e9 s\u00e9duit par l&#8217;id\u00e9e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ok, j&#8217;en avais compris les int\u00e9r\u00eats dans les grandes lignes :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>S&#8217;assurer qu&#8217;un code fonctionne tel qu&#8217;on s&#8217;y attend,<\/li><li>V\u00e9rifier qu&#8217;un code fonctionne aux bornes du syst\u00e8me,<\/li><li>S&#8217;assurer qu&#8217;un changement n&#8217;entra\u00eene pas une r\u00e9gression,<\/li><li>Automatiser une t\u00e2che r\u00e9p\u00e9titive donc chiante,<\/li><li>\u00catre beaucoup plus serein pendant les phases de refactoring,<\/li><li>Rentrer chez soi avec la satisfaction d&#8217;un travail abouti.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Il ne restait plus qu&#8217;\u00e0 la mettre en pratique. Je me suis alors jet\u00e9 dans le grand bain, sans exp\u00e9rience et sans r\u00e9el approfondissement du sujet.<br>Erreur, que j&#8217;allais payer rapidement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tr\u00e8s vite confront\u00e9 \u00e0 des probl\u00e8mes divers qui ralentissaient consid\u00e9rablement ma capacit\u00e9 \u00e0 produire le &#8220;vrai&#8221; code, je devais r\u00e9fl\u00e9chir autrement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><strong>J&#8217;ai pas le temps de faire des tests, on devrait les inclure \u00e0 nos chiffrages.<\/strong><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Echec total, renoncement, rejet d&#8217;un concept qui semblait prometteur.<\/p>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\"><strong>Certes les tests prennent du temps, mais correctement impl\u00e9ment\u00e9s, en font gagner beaucoup plus.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/github.com\/fleporcq\/revuedecode.fr\/blob\/master\/content\/post\/ma-rencontre-avec-les-tests.md#mes-erreurs\"><\/a>Mes erreurs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">J&#8217;ai pu rencontrer, lors de conf\u00e9rences, des d\u00e9veloppeurs manifestement conquis par les tests. Il \u00e9tait \u00e9vident que j&#8217;\u00e9tais pass\u00e9 \u00e0 c\u00f4t\u00e9 de quelque chose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;id\u00e9e m&#8217;avait sembl\u00e9e pourtant bonne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><strong>Comme j&#8217;ai peu de temps, je vais traverser la stack de bout en bout pour la tester dans son int\u00e9gralit\u00e9.<\/strong><\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">D&#8217;o\u00f9 la cr\u00e9ation de tests qui lanceraient des requ\u00eates http et feraient des assertions sur le contenu retourn\u00e9. Si le contenu retourn\u00e9 est celui attendu, j&#8217;extrapole le fait que les couches interm\u00e9diaires ont correctement fonctionn\u00e9. G\u00e9nial ! Pas tant que \u00e7a&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Premiers points g\u00eanants :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ca ne peut s&#8217;appliquer qu&#8217;\u00e0 un environnement web,<\/li><li>Si je veux r\u00e9utiliser la couche m\u00e9tier dans un autre projet, je n&#8217;ai plus aucun test,<\/li><li>Les donn\u00e9es d&#8217;entr\u00e9e ne peuvent \u00eatre envoy\u00e9es que par http,<\/li><li>Les assertions sont complexes \u00e0 r\u00e9aliser car je dois au pr\u00e9alable parser le retour html.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">De plus, comme l&#8217;ensemble de la stack est travers\u00e9, il est indispensable que toutes les couches soient pr\u00e9sentes. L&#8217;environnement de test n&#8217;\u00e9tant pas un environnement d&#8217;ex\u00e9cution &#8220;normal&#8221; (comme dev ou prod), je dois simuler certaines couches (cf.&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Mock_(programmation_orient%C3%A9e_objet)\" target=\"_blank\" rel=\"noreferrer noopener\">mock<\/a>). Dans mon cas, par exemple, la session utilisateur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, pour pouvoir faire des assertions correctes, il faut \u00e9galement <strong>ma\u00eetriser le jeu de donn\u00e9es initiales<\/strong>. Or, je n&#8217;ai pas d&#8217;acc\u00e8s direct \u00e0 la couche m\u00e9tier. Je suis donc dans l&#8217;obligation de cr\u00e9er une base de donn\u00e9es sp\u00e9cifique \u00e0 l&#8217;environnement de test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avant d&#8217;avoir commenc\u00e9, on voit d\u00e9j\u00e0 beaucoup de complications appara\u00eetre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois l&#8217;environnement en place, un autre probl\u00e8me est rapidement apparu. Les donn\u00e9es de test \u00e9tant centralis\u00e9es dans une base de donn\u00e9es, elles devenaient communes \u00e0 l&#8217;ensemble des tests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Un test qui modifiait l&#8217;\u00e9tat de cette base impactait directement les tests suivants !<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nouveau cap : r\u00e9initialiser la base de donn\u00e9es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En cons\u00e9quence, j&#8217;ai d\u00fb <strong>r\u00e9initialiser la base de donn\u00e9es avant chaque test<\/strong>. C&#8217;est bourrin et tr\u00e8s inefficace ! Malgr\u00e9 cette r\u00e9initialisation syst\u00e9matique, mes tests \u00e9taient toujours tr\u00e8s d\u00e9pendants les uns des autres. L&#8217;insertion de donn\u00e9es initiales dans la base impactait \u00e9galement l&#8217;ensemble des tests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il devenait tr\u00e8s compliqu\u00e9 de modifier ou d&#8217;ajouter un test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L&#8217;environnement de test doit \u00eatre simple \u00e0 mettre oeuvre, l&#8217;ajout d&#8217;un test doit \u00eatre une op\u00e9ration triviale et rapide. Si ce n&#8217;est pas le cas, vous constaterez un d\u00e9sengagement des d\u00e9veloppeurs \u00e0 les maintenir et \u00e0 les faire \u00e9voluer.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le package &#8220;tests&#8221; est devenu peu \u00e0 peu une ville fant\u00f4me o\u00f9 n&#8217;erraient plus que quelques \u00e2mes perdues.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><a href=\"https:\/\/camo.githubusercontent.com\/7d1c552b54f43c43afa3bd0222ff38c3239448788fcf24e965444fb2056fbd81\/68747470733a2f2f6d656469612e67697068792e636f6d2f6d656469612f57304b694d6c51496a346e7a712f67697068792e676966\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/7d1c552b54f43c43afa3bd0222ff38c3239448788fcf24e965444fb2056fbd81\/68747470733a2f2f6d656469612e67697068792e636f6d2f6d656469612f57304b694d6c51496a346e7a712f67697068792e676966\" alt=\"Far west\" width=\"250\" height=\"100\" title=\"Far west\"\/><\/a><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ce type de tests est appel\u00e9 <strong>tests fonctionnels<\/strong> car <strong>ils s&#8217;emploient \u00e0 v\u00e9rifier le bon fonctionnement g\u00e9n\u00e9ral d&#8217;une application tel que le ferait un humain.<\/strong><br>Ce sont ce qu&#8217;on pourrait appeler des tests de haut niveau.<br>D&#8217;autres tests de ce genre vont jusqu&#8217;\u00e0 reproduire automatiquement le comportement d&#8217;un utilisateur directement depuis un navigateur (cf.&nbsp;<a href=\"https:\/\/fr.wikipedia.org\/wiki\/Selenium_(informatique)\" target=\"_blank\" rel=\"noreferrer noopener\">Selenium<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Est-ce que les tests fonctionnels sont intrins\u00e8quement mauvais ?<\/strong><br>Je ne pense pas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ils peuvent \u00eatre tr\u00e8s adapt\u00e9s pour tester les retours d&#8217;une api rest, ou dans le test d&#8217;interfaces. Mais pas pour une couche m\u00e9tier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Retour \u00e0 la case d\u00e9part,<strong> je devais trouver un socle de test plus en ad\u00e9quation avec mon besoin.<\/strong> <strong><a href=\"https:\/\/digiwin.fr\/diginews\/tests-voyons-petit-voyons-unitaire\/\" target=\"_blank\" rel=\"noreferrer noopener\">Je devais voir plus petit<\/a><\/strong>.<\/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, objet de cet article, et l&#8217;approche m\u00e9thodique de r\u00e9alisation que vous trouverez dans le second article. Initiation [&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-6404","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\/6404","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=6404"}],"version-history":[{"count":0,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/6404\/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=6404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=6404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=6404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}