{"id":2024,"date":"2014-09-15T14:41:41","date_gmt":"2014-09-15T13:41:41","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=2024"},"modified":"2014-09-16T10:47:18","modified_gmt":"2014-09-16T09:47:18","slug":"application-legacy-refactoring-reengineering-6","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-6\/","title":{"rendered":"Application Legacy \u2013 Refactoring ou reengineering? (VI)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-2026\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy_Legacy_TestEffort1.jpg\" alt=\"Qualilogy -Application Legacy - Effort de test\" width=\"239\" height=\"360\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy_Legacy_TestEffort1.jpg 239w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy_Legacy_TestEffort1-199x300.jpg 199w\" sizes=\"(max-width: 239px) 100vw, 239px\" \/><\/a>Nous avons pr\u00e9sent\u00e9 dans les deux posts pr\u00e9c\u00e9dents la notion de tests (unitaires) de caract\u00e9risation, propos\u00e9e par Michael Feathers dans son livre \u2018Working Effectively with Legacy Code\u2019.<\/p>\n<p>Nous avons montr\u00e9 bri\u00e8vement comment nous pouvons utiliser de tels tests afin d\u2019acqu\u00e9rir la connaissance du comportement de l\u2019application. Je dis bien bri\u00e8vement car, id\u00e9alement, il nous aurait fallu d\u00e9velopper et pr\u00e9senter quelques tests \u00e0 titre d\u2019exemple, mais cela n\u00e9cessiterait plusieurs posts, et cette s\u00e9rie est d\u00e9j\u00e0 bien longue. Je vous renvoie au livre de Michael Feathers si vous souhaitez approfondir cette question.<\/p>\n<p>Retenons simplement que l\u2019\u00e9criture de ces tests facilitera le transfert de connaissances de notre application Legacy (Word 1.1a de Microsoft), et que toute op\u00e9ration ult\u00e9rieure de refactoring ou de r\u00e9-engineering en sera plus rapide et plus s\u00fbre. <!--more--><\/p>\n<h2>Couverture de tests<\/h2>\n<p>Mais quelle doit \u00eatre l\u2019ampleur de cette op\u00e9ration de \u2018caract\u00e9risation\u2019 ? Quand pouvons-nous consid\u00e9rer que notre couverture de tests est suffisante, et commencer \u00e0 effectuer des modifications dans le code ? Est-il possible de chiffrer l\u2019effort que cela repr\u00e9sente ?<\/p>\n<p>Michael Feathers recommande d\u2019\u00e9crire autant de tests que nous pouvons juger n\u00e9cessaire, pour chaque bloc de code que nous aurons \u00e0 modifier dans le futur. Cependant, que se passe-t-il s\u2019il n\u2019est pr\u00e9vu aucune modification de code dans le futur ?<\/p>\n<p>Ce n\u2019est pas un cas si rare : lorsqu\u2019une entreprise rach\u00e8te un \u00e9diteur logiciel, elle peut souhaiter ne pas faire \u00e9voluer un produit, mais simplement en assurer le support jusqu\u2019\u00e0 ce qu\u2019il meure de sa belle mort, lorsque plus aucun client ne paie la maintenance.<br \/>\nAutre cas : je connais des directions informatiques qui ont perdu presque compl\u00e8tement la connaissance de groupes entiers d\u2019applications Cobol, PL1, Natural, Oracle Forms. Ces applications sont :<\/p>\n<ul>\n<li>Souvent critiques, car au c\u0153ur historique du syst\u00e8me d\u2019information.<\/li>\n<li>Compl\u00e8tement \u00e9prouv\u00e9es, donc connaissent tr\u00e8s peu de d\u00e9fauts et de maintenance corrective.<\/li>\n<li>Evoluent peu, et plut\u00f4t au niveau de leurs interfaces pour se brancher avec de nouvelles applications, qu\u2019au niveau de leur logique m\u00e9tier.<\/li>\n<\/ul>\n<p>Une strat\u00e9gie possible pour ces directions informatiques consiste \u00e0 outsourcer ce code, mais en veillant au transfert de connaissances, afin d\u2019\u00e9viter de \u2018casser\u2019 ce qui marche bien.<\/p>\n<p>La <a title=\"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (I)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-1\/\" target=\"_blank\">mission qui nous est assign\u00e9e<\/a> est de calculer le co\u00fbt du transfert de connaissances de cette application vers une autre \u00e9quipe. Comment pouvons-nous estimer cet effort de d\u00e9couverte du code \u00e0 travers ces tests de caract\u00e9risation ? Existe-t-il une formule qui permette d\u2019\u00e9valuer cet effort et planifier en cons\u00e9quence les ressources n\u00e9cessaires et un calendrier ?<\/p>\n<h2>Complexit\u00e9 et lisibilit\u00e9<\/h2>\n<p>J\u2019ai toujours consid\u00e9r\u00e9, dans les diff\u00e9rents audits que je suis amen\u00e9 \u00e0 r\u00e9aliser, que la Complexit\u00e9 Cyclomatique \u00e9tait repr\u00e9sentative de l\u2019effort de tests.<\/p>\n<p>Une petite application r\u00e9cente, non critique, interne \u00e0 l\u2019entreprise et sans utilisateurs ext\u00e9rieurs \u00e0 celle-ci, avec environ 6 000 points de CC, peut se satisfaire de tests unitaires et d\u2019int\u00e9gration par l\u2019\u00e9quipe de projet, sans passer par une phase de QA formalis\u00e9e.<\/p>\n<p>Une application plus ancienne, ouverte sur l\u2019ext\u00e9rieur \u2013 par exemple, un frontal \u2018Clients\u2019 de diff\u00e9rentes autres applications et progiciels de commandes, facturation, stocks, etc. \u2013 donc critique pour l\u2019entreprise, et sup\u00e9rieure \u00e0 plus de 60 000 points de CC : phase de QA obligatoire, par une \u00e9quipe de testeurs sp\u00e9cialis\u00e9e, avec cahiers de tests et jeux d\u2019essai formalis\u00e9s, et si possible automatis\u00e9s.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1751\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\" alt=\"Word_Complexity\" width=\"348\" height=\"160\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg 348w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity-300x137.jpg 300w\" sizes=\"(max-width: 348px) 100vw, 348px\" \/><\/a><a title=\"Audit d\u2019une application Legacy en C \u2013 Microsoft Word 1.1a (I)\" href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">A ce sujet, nous avons vu<\/a> que notre application comptait 43 846 points de CC, r\u00e9partis dans 3 936 fonctions et 349 fichiers.<\/p>\n<p>La <a title=\"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (I)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-1\/\" target=\"_blank\">r\u00e9partition de la Complexit\u00e9 Cyclomatique<\/a> parmi ces fonctions est la suivante :<\/p>\n<p style=\"text-align: center\"><strong><em>Tableau 1 \u2013 Complexit\u00e9 Cyclomatique des fonctions de l\u2019application Word 1.1a<\/em><\/strong><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1824\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns.jpg\" alt=\"Word_CCDistribFns\" width=\"244\" height=\"272\" \/><\/a><\/p>\n<p style=\"text-align: left\">Je ne vais pas prendre comme objectif une couverture de tests de 100% de la Complexit\u00e9 Cyclomatique, car comme vous le savez probablement, au-del\u00e0 d\u2019une certaine limite, le temps d\u2019\u00e9criture de nouveaux tests devient de plus en plus long. L\u2019effort de test r\u00e9pond (approximativement) \u00e0 une loi de Pareto selon laquelle il est possible d\u2019\u00e9crire 80% des tests en 20% du temps.<\/p>\n<p>En fait, je pense que 80\/20 est un peu optimiste et je vais relativiser en consid\u00e9rant que 60% des tests sont r\u00e9alisables en 50% du temps, et les 40% additionnels n\u00e9cessiteront un autre 50%. Notre objectif principal est d\u2019abord d\u2019effectuer un transfert de connaissances vers une nouvelle \u00e9quipe, pas d\u2019atteindre une couverture de tests de 100%.<\/p>\n<p>Par contre, les fonctions les plus complexes n\u00e9cessitent une vigilance accrue, car elles pr\u00e9sentent un risque plus important d\u2019introduire un d\u00e9faut \u00e0 l\u2019occasion d\u2019une modification. Ces fonctions sont \u00e9galement candidates \u00e0 un \u00e9ventuel refactoring, donc une meilleure \u2018caract\u00e9risation\u2019, notamment si elles sont peu lisibles, avec un nombre \u00e9lev\u00e9 de lignes de code ou avec des d\u00e9fauts impactant la maintenabilit\u00e9. Nous allons donc hausser notre exigence de tests pour celles-ci.<\/p>\n<p>En cons\u00e9quence, je vais poser les hypoth\u00e8ses suivantes :<\/p>\n<ul>\n<li>Pour les fonctions avec une CC inf\u00e9rieure ou \u00e9gale \u00e0 20 points, la couverture de tests sera de 60% de la Complexit\u00e9 Cyclomatique.<\/li>\n<li>Pour les fonctions avec une CC sup\u00e9rieure \u00e0 20 points, nous souhaitons une couverture de 100% de la Complexit\u00e9 Cyclomatique.<\/li>\n<\/ul>\n<p>SonarQube dispose d\u2019une r\u00e8gle \u2018Avoid too complex function\u2019 qui liste les fonctions au-del\u00e0 de 20 points de CC, avec leur nombre pr\u00e9cis. Ceci nous a permis de calculer <a title=\"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (I)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-1\/\" target=\"_blank\">la distribution suivante<\/a> :<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 2 \u2013 Distribution des fonctions les plus complexes <\/strong><\/em><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1836\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg\" alt=\"Word_CCDistribLargestFns\" width=\"405\" height=\"195\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg 405w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns-300x144.jpg 300w\" sizes=\"(max-width: 405px) 100vw, 405px\" \/><\/a><\/p>\n<p style=\"text-align: left\">Une autre r\u00e8gle \u2018Function\/method should not have too many lines\u2019, liste l\u00e0 encore les fonctions avec plus de 100 lignes de codes, et le nombre exact de ces derni\u00e8res.<br \/>\nJe peux donc croiser ces deux listes afin d\u2019identifier les fonctions avec plus de 20 points de CC et plus de 100 lignes de code. J\u2019obtiens la distribution suivante :<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 3 \u2013 Distribution des fonctions les plus complexes par taille (LOC)<\/strong><\/em><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-CC-LOC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2038\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-CC-LOC.jpg\" alt=\"Qualilogy-Legacy-CC-LOC\" width=\"606\" height=\"228\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-CC-LOC.jpg 606w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-CC-LOC-300x112.jpg 300w\" sizes=\"(max-width: 606px) 100vw, 606px\" \/><\/a><\/p>\n<p style=\"text-align: left\">Je n\u2019ai pas inclus dans le tableau pr\u00e9c\u00e9dent <a title=\"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (II)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-2\/\" target=\"_blank\">les 6 fonctions les plus complexes<\/a>, au-del\u00e0 de 200 points de CC, et qui se trouvent \u00e9galement dans des programmes complexes ou avec un grand nombre de lignes :<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 4 \u2013 6 programmes avec les fonctions les plus complexes<br \/>\n<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-6max.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2039 aligncenter\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-6max.jpg\" alt=\"Qualilogy-Legacy-TestEffort-6max\" width=\"194\" height=\"154\" \/><\/a><\/p>\n<h2 style=\"text-align: left\">Estimation de l\u2019effort de tests<\/h2>\n<p>Nous parvenons donc \u00e0 une classification des diff\u00e9rents composants en 3 cat\u00e9gories, des fonctions les plus simples avec peu de lignes, aux fonctions les plus complexes, de taille importante \u00e0 tr\u00e8s importante, et qui comptent \u00e9galement nombre de violations aux bonnes pratiques de programmation dommageables pour la compr\u00e9hension du code.<\/p>\n<p>Afin de calculer une mesure de l\u2019effort de tests, je vais me baser sur la formule suivante :<\/p>\n<p style=\"text-align: center\"><strong><em>Test Effort = Code Reading Time + Characterization Test<\/em><\/strong><\/p>\n<p style=\"text-align: center\">avec : <strong>Code Reading time = CC\/2 (mn) x Readibility Factor%<\/strong><\/p>\n<p style=\"text-align: center\">et : <strong>Characterization Test = CC x N (mn)<\/strong><\/p>\n<p>J\u2019utilise trois variables dans cette formule :<\/p>\n<ul>\n<li>Code Reading (CR) time sera le temps n\u00e9cessaire pour \u2018lire\u2019 une fonction C et en d\u00e9duire les tests de caract\u00e9risation correspondants.<\/li>\n<li>Readibility Factor% (RF%) sera un facteur de lisibilit\u00e9 du code.<\/li>\n<li>Characterization Test (CT) sera le temps d\u2019\u00e9criture et d\u2019ex\u00e9cution de ces tests, avec un nombre N de minutes d\u00e9pendant de la Complexit\u00e9 Cyclomatique, et que je vais adapter en fonction du type de composant.<\/li>\n<\/ul>\n<p><a title=\"Application Legacy \u2013 Refactoring ou reengineering? (V)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-5\/\" target=\"_blank\">Rappelons nous<\/a> qu\u2019un test de caract\u00e9risation permet de d\u00e9crire le comportement d\u2019un bloc de code et donc, contrairement \u00e0 un test unitaire ou \u00e0 un test de r\u00e9gression, ne cherche pas \u00e0 v\u00e9rifier que ce code se comporte de mani\u00e8re correcte. Une compr\u00e9hension compl\u00e8tement parfaite de la fonction et de chacune de ses variables, constantes, param\u00e8tres, valeurs d\u2019input\/output, \u2026 n\u2019est donc pas requise. Raison pour laquelle je parle de \u2018lire\u2019 la fonction, c\u2019est-\u00e0-dire d\u00e9chiffrer celle-ci assez rapidement pour commencer \u00e0 \u00e9crire des tests de caract\u00e9risation.<\/p>\n<p>Cependant, plus une fonction sera peu complexe et peu lisible, avec des \u2018goto\u2019, des \u2018switch\u2019, etc. moins\u00a0 elle sera facile \u00e0 appr\u00e9hender. Je vais donc utiliser un facteur de lisibilit\u00e9 \u2013 Code Reading (CR)\u00a0 \u2013 afin de moduler ce temps de d\u00e9chiffrage de la fonction.<\/p>\n<p>Je vais \u00e9galement moduler le temps de r\u00e9alisation des tests de caract\u00e9risation, car celui-ci sera diff\u00e9rent selon le nombre de points de CC. Nous avons vu <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (V)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-5\/\" target=\"_blank\">dans le dernier post<\/a> que la fonction la plus complexe de notre application comportait des \u2018switch\u2019 avec des conditions sur plusieurs variables, assez rapidement compr\u00e9hensibles et faciles \u00e0 tester. Dans un tel cas, cela ne prendra pas beaucoup plus de temps pour tester un seul \u2018switch\u2019 avec 8 ou 10 points de CC qu\u2019une fonction avec 2 ou 3 points de CC.<\/p>\n<p>Je vais donc poser encore une fois les hypoth\u00e8ses suivantes :<\/p>\n<ul>\n<li>Pour les fonctions avec une CC inf\u00e9rieure ou \u00e9gale \u00e0 20 points, le temps d\u2019\u00e9criture des tests sera \u00e9gal \u00e0 4 minutes par point de CC.<\/li>\n<li>Pour les fonctions avec une CC sup\u00e9rieure \u00e0 20 points, le temps d\u2019\u00e9criture des tests sera \u00e9gal \u00e0 2 minutes par point de CC.<\/li>\n<\/ul>\n<p>Avec cette formule, une fonction avec une Complexit\u00e9 Cyclomatique \u00e9gale \u00e0 :<\/p>\n<ul>\n<li>1, n\u00e9cessite une demi-minute de temps de lecture et 4 mn de r\u00e9alisation de test(s) de caract\u00e9risation, pour un total de 4 mn et 30 secondes.<\/li>\n<li>2, n\u00e9cessite 1 minute de temps de lecture et 8 mn de r\u00e9alisation de tests pour un total de 9 minutes.<\/li>\n<li>8, n\u00e9cessite 4 minutes de temps de lecture et 32 mn de r\u00e9alisation de tests pour un total de 36 minutes.<\/li>\n<li>12, n\u00e9cessite 6 minutes de temps de lecture et 49 mn de r\u00e9alisation de tests pour un total de 54 minutes.<\/li>\n<\/ul>\n<p>En fait, je n\u2019ai pas la CC exacte pour les fonctions avec moins de 20 points, donc je vais consid\u00e9rer que le temps de r\u00e9alisation des tests sera de 9 mn pour les fonctions des 2 \u00e0 4 points de CC, de 36 mn pour les fonctions de 8 \u00e0 10 points de CC, de 54 mn pour les fonctions de 12 \u00e0 20 points de CC, etc.<\/p>\n<p>Ceci suppose un facteur multiplicateur de lisibilit\u00e9 du code (RF%) = 1. Je modifierai la valeur de ce facteur lorsque les fonctions vont devenir plus complexes (au-del\u00e0 de 20 points de CC) ou moins lisibles.<\/p>\n<p>Ces chiffres me semblent assez r\u00e9alistes, ou en tout cas, ne me semblent pas sous-estim\u00e9s. Je peux parfaitement pr\u00e9senter cette hypoth\u00e8se de calcul \u00e0 une \u00e9quipe de projet ou des stakeholders : m\u00eame s\u2019ils comprendront qu\u2019il s\u2019agit d\u2019une approximation, cette base me para\u00eet acceptable afin de proc\u00e9der \u00e0 notre estimation.<\/p>\n<p>Voyons un peu ce que cela nous donne, tout d\u2019abord sur les fonctions \u00e0 moins de 20 points de Complexit\u00e9 Cyclomatique :<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 5 \u2013 Calcul de l&rsquo;effort de test sur les fonctions les plus simples (&lt; 20 CC)<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSub20.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2048\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSub20.jpg\" alt=\"Calcul de l'effort de test sur les fonctions les moins complexes\" width=\"569\" height=\"213\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSub20.jpg 569w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSub20-300x112.jpg 300w\" sizes=\"(max-width: 569px) 100vw, 569px\" \/><\/a>Nous comptons 3 397 fonctions de moins de 20 points de CC, pour lesquelles nous visons une couverture de 60% de tests\u00a0 de la Complexit\u00e9 Cyclomatique, et donc \u00e9quivalent \u00e0 2 039 fonctions. Ainsi :<\/p>\n<ul>\n<li style=\"text-align: left\">413 des 689 fonctions avec 1 point de CC, et un co\u00fbt unitaire de test de 4.5 mn repr\u00e9sentent 31 heures de travail soit pr\u00e9s de 4 jours (\u00e0 8 heures par jour).<\/li>\n<li style=\"text-align: left\">522 des 870 fonctions avec 2 \u00e0 4 points de CC, et un co\u00fbt unitaire de test de 9 mn repr\u00e9sentent 78.3 heures de travail soit pr\u00e9s de 10 jours, pour un total cumul\u00e9 (avec les 4 jours pr\u00e9c\u00e9dents) de pr\u00e9s de 14 jours.<\/li>\n<li style=\"text-align: left\">295 des 491 fonctions avec 12 \u00e0 20 points de CC, et un co\u00fbt unitaire de test de 54 mn repr\u00e9sentent environ 33 jours de travail, soit un bon tiers des 93.5 jours n\u00e9cessaires au total.<\/li>\n<\/ul>\n<p style=\"text-align: left\">Gardons ce chiffre en t\u00eate pour l\u2019instant et passons aux fonctions plus complexes. Nous avons dit que pour celles-ci :<\/p>\n<ul>\n<li style=\"text-align: left\">Nous souhaitons une couverture de tests \u00e9gale \u00e0 100% de la Complexit\u00e9 Cyclomatique.<\/li>\n<li style=\"text-align: left\">Nous estimons le temps d\u2019\u00e9criture d\u2019un test de caract\u00e9risation au nombre de points de CC x 2 minutes.<\/li>\n<\/ul>\n<p style=\"text-align: left\">Je vais \u00e9galement moduler le facteur de lisibilit\u00e9 (Readibility Factor ou RF%) de la mani\u00e8re suivante :<\/p>\n<ul>\n<li style=\"text-align: left\">Pour les fonctions inf\u00e9rieures \u00e0 100 lignes de code (LOC), RF% = 1.<\/li>\n<li style=\"text-align: left\">De 100 \u00e0 200 LOC, RF% = 1.5<\/li>\n<li style=\"text-align: left\">De 200 \u00e0 300 LOC, RF% = 2<\/li>\n<li style=\"text-align: left\">De 300 \u00e0 500 LOC, RF% = 2.5<\/li>\n<li style=\"text-align: left\">De 500 \u00e0 700 LOC, RF% = 4<\/li>\n<li style=\"text-align: left\">Au-del\u00e0 de 700 LOC (mais moins de 200 points de CC), RF% = 10. Cela ne concerne que 4 fonctions, sans inclure les 6 fonctions les plus complexes, que nous verrons s\u00e9par\u00e9ment.<\/li>\n<\/ul>\n<p>Voici le tableau correspondant :<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 6 \u2013 Calcul de l&rsquo;effort de test sur les fonctions tr\u00e8s complexes (20 &lt; CC &lt; 200)<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2049\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20.jpg\" alt=\"Calcul de l'effort de test pour les fonctions complexes \u00e0 tr\u00e8s complexes\" width=\"669\" height=\"554\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20.jpg 669w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20-300x248.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20-624x516.jpg 624w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><\/a><br \/>\nA titre d\u2019explications, et afin de faciliter la compr\u00e9hension de ce tableau :<\/p>\n<ul>\n<li style=\"text-align: left\">137 fonctions avec une CC entre 20 et 30 points et moins de 100 LOC, repr\u00e9sentant chacune une charge d\u2019\u00e9criture de tests de 40 mn (RF% = 1) et une couverture de test de 100% de la CC, n\u00e9cessitent 14.3 jours de travail.<\/li>\n<li style=\"text-align: left\">95 fonctions avec une CC entre 20 et 30 points et une taille de 100 \u00e0 200 LOC, donc avec un Readibility Factor \u00e9gal \u00e0 1.5 et une charge de tests de 55 mn par fonction, n\u00e9cessitent 10.9 jours de travail. Le cumul avec la charge pr\u00e9c\u00e9dente est \u00e9gal \u00e0 14.3 + 10.9 = 25.2 jours.<\/li>\n<li style=\"text-align: left\">1 fonction avec une CC entre 60 et 70 points et une taille entre 500 et 700 LOC, avec un RF% de 4, aura un temps estim\u00e9 de \u2018lisibilit\u00e9\u2019 (Reading Time) de 120 mn (60 \/ 2 x 4) et un temps d\u2019\u00e9criture de tests de 120 mn \u00e9galement, pour un total de 4 heures ou une demi-journ\u00e9e.<\/li>\n<li style=\"text-align: left\">4 fonctions avec une CC entre 100 et 200 points et plus de 700 LOC, avec un RF% de 10, aura un temps estim\u00e9 de 700 mn par fonction, pour un total de pr\u00e9s de 6 jours de travail afin de \u2018caract\u00e9riser\u2019 ces 4 fonctions.<\/li>\n<\/ul>\n<p>J\u2019ai effectu\u00e9 un calcul sp\u00e9cifique \u00e0 chacune des 6 fonctions les plus lourdes et complexes :<\/p>\n<p style=\"text-align: center\">\u00a0<em><strong>Tableau 7 \u2013 Calcul de l&rsquo;effort de test sur les fonctions de complexit\u00e9 maximale (&gt; 200 CC)<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2051\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max.jpg\" alt=\"Qualilogy-Legacy-TestEffort-CC6max\" width=\"671\" height=\"188\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max.jpg 671w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max-300x84.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max-624x174.jpg 624w\" sizes=\"(max-width: 671px) 100vw, 671px\" \/><\/a><\/p>\n<p style=\"text-align: left\">A part le programme \u2018command2.c\u2019 avec une fonction de moins de 400 lignes, et donc un facteur RF% de 2.5, j\u2019ai affect\u00e9 un RF% de 10 aux autres fonctions et un RF% de 20 pour la fonction la plus importante, dans le programme \u2018RTFOUT.c\u2019 (dont nous avons parl\u00e9 dans <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (V)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-5\/\" target=\"_blank\">le post pr\u00e9c\u00e9dent<\/a>).<\/p>\n<h2 style=\"text-align: left\">Synth\u00e8se<\/h2>\n<p style=\"text-align: left\">Sur la base des hypoth\u00e8ses que nous avons choisies, nous parvenons \u00e0 un total de 234 jours pour la r\u00e9alisation de tests de caract\u00e9risation sur notre application Legacy en C, avec un objectif de transfert de connaissances de cette application vers une autre \u00e9quipe, ou \u00e0 l\u2019occasion d\u2019un outsourcing.<\/p>\n<p style=\"text-align: left\">Ces 234 jours, un peu moins de 12 mois\/hommes (sur la base de 20 jours par mois) se r\u00e9partissent de la facon suivante :<\/p>\n<ul>\n<li style=\"text-align: left\">93.5 jours pour une couverture de tests de 60% de la Complexit\u00e9 Cyclomatique totale pour les 3 397 fonctions de moins de 20 points de CC.<\/li>\n<li style=\"text-align: left\">117 jours pour une couverture totale des 533 fonctions entre 20 et 200 points de CC.<\/li>\n<li style=\"text-align: left\">23.5 jours pour caract\u00e9riser les 6 fonctions les plus complexes et les plus volumineuses.<\/li>\n<\/ul>\n<p>Que penser de ces chiffres ? Nos hypoth\u00e8ses sont-elles correctes ou discutables ? Si nous devons pr\u00e9senter nos r\u00e9sultats devant l\u2019\u00e9quipe de projet ou le management, quelles sont les questions susceptibles d\u2019appara\u00eetre et comment y r\u00e9pondre ? Quel plan d\u2019action en tirer ?<\/p>\n<p>Je vais vous laisser r\u00e9fl\u00e9chir \u00e0 tout cela, en attendant d\u2019aborder ces diff\u00e9rents points dans notre prochain post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons pr\u00e9sent\u00e9 dans les deux posts pr\u00e9c\u00e9dents la notion de tests (unitaires) de caract\u00e9risation, propos\u00e9e par Michael Feathers dans son livre \u2018Working Effectively with Legacy Code\u2019. Nous avons montr\u00e9 bri\u00e8vement comment nous pouvons utiliser de tels tests afin d\u2019acqu\u00e9rir la connaissance du comportement de l\u2019application. Je dis bien bri\u00e8vement car, id\u00e9alement, il nous aurait [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-2024","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2024"}],"collection":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/comments?post=2024"}],"version-history":[{"count":31,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2024\/revisions"}],"predecessor-version":[{"id":2063,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2024\/revisions\/2063"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=2024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=2024"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=2024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}