{"id":277,"date":"2012-12-10T06:53:09","date_gmt":"2012-12-10T06:53:09","guid":{"rendered":"http:\/\/arthurlambert.fr\/robotique\/wordpress\/?p=277"},"modified":"2014-04-17T18:17:48","modified_gmt":"2014-04-17T18:17:48","slug":"gcov-taux-de-couverture-dune-suite-de-test","status":"publish","type":"post","link":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/gcov-taux-de-couverture-dune-suite-de-test\/","title":{"rendered":"<!--:fr-->GCOV : Taux de couverture d&#8217;une suite de test<!--:-->"},"content":{"rendered":"<p><!--:fr-->Voici un outil bien pratique pour la phase de test d&#8217;un projet ou pour trouver du code mort : GCOV. En effet Gcov va nous permettre de voir le taux de couverture de nos jeux de tests en nous montrant le pourcentage de ligne de code et de branchements test\u00e9s.<\/p>\n<p>But : <strong>D\u00e9termine le taux de couverture de nos tests sur un projet afin de d\u00e9tecter\u00a0\u00e9ventuellement\u00a0du code mort et surtout d&#8217;\u00eatre certain de tester 100% du code produit.<\/strong><\/p>\n<p>Pr\u00e9requis pour un programme en espace utilisateur:\u00a0\u00a0<strong>lcov 1.9<\/strong>. Pour un module noyau, cela\u00a0n\u00e9cessite\u00a0\u00e9videmment\u00a0les sources du noyau et les flags associ\u00e9s \u00e0 GCOV d&#8217;activ\u00e9s dans le configure du noyau dans le cas ou nous souhaitons profiler le noyau lui m\u00eame.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_configure_kernel.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-280\" title=\"gcov_configure_kernel\" src=\"http:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_configure_kernel.png\" alt=\"\" width=\"695\" height=\"182\" srcset=\"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_configure_kernel.png 869w, https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_configure_kernel-300x78.png 300w, https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_configure_kernel-500x131.png 500w\" sizes=\"auto, (max-width: 695px) 100vw, 695px\" \/><\/a><\/p>\n<p>Voici un programme simple pour calculer un factorielle :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#include\r\n#include\r\nint usage ()\r\n{\r\n printf (&quot;usage: .\/facto N\\n&quot;);\r\n printf (&quot;\\tN : decimal value (MAX : 20)\\n\\n&quot;);\r\n printf (&quot;Compute the factorial value of an integer value.\\n\\n&quot;);\r\n\r\nreturn 1;\r\n}\r\n\r\nunsigned long long facto(unsigned long long n)\r\n{\r\n if (n == 0)\r\n    return 1;\r\n return n * facto(n - 1);\r\n\r\n}\r\n\r\nint main (int argc, char *argv&#x5B;])\r\n{\r\n char* ptr;\r\n\r\nif (argc != 2)\r\n return usage ();\r\n\r\nlong int n = strtol(argv&#x5B;1], &amp;ptr, 0);\r\n\r\nif (ptr&#x5B;0] || n &lt; 0 || n &gt; 20)\r\n return usage ();\r\n\r\nprintf (&quot;%ld\\n&quot;, facto(n));\r\n return 0;\r\n}\r\n\r\n<\/pre>\n<p>Voici un script shell de test :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/sh\r\n\r\nn=0\r\n\r\nred=&quot;&#92;&#48;33&#x5B;31m&quot;;\r\nwhite=&quot;&#92;&#48;33&#x5B;37m&quot;;\r\ngreen=&quot;&#92;&#48;33&#x5B;32m&quot;;\r\nblue=&quot;\\&#92;&#48;33&#x5B;1;34m&quot;;\r\n\r\ntest_facto ()\r\n{\r\n    # $1 is facto argument\r\n    # $2 is return value by program\r\n    # $3 is result\r\n    echo &quot;Test $i : Run facto with n = $1.&quot;\r\n    .\/facto $1 2&gt;\/dev\/null 1&gt;&amp;2\r\n    ret1=`echo $?`\r\n    .\/facto $1 2&gt;\/dev\/null | grep $3 &gt;\/dev\/null 2&gt;&amp;1\r\n    ret2=`echo $?`\r\n    if &#x5B; $2 -eq $ret1 ] &amp;&amp; &#x5B; $ret2 -eq 0 ]; then\r\n\t   printf $green\r\n\t   echo OK\r\n    else\r\n\t   printf $red\r\n\t   echo KO\r\n    fi;\r\n    printf $blue\r\n    i=$(($i+1));\r\n}\r\n\r\nprintf $blue\r\n\r\ntest_facto 0 0 1\r\ntest_facto 1 0 1\r\ntest_facto 2 0 2\r\ntest_facto 3 0 6\r\ntest_facto 4 0 24\r\ntest_facto 5 0 120\r\ntest_facto 6 0 720\r\ntest_facto 12 0 479001600\r\ntest_facto efsf 1 usage\r\ntest_facto efez54zfz 1 usage\r\ntest_facto ffzeef 1 usage\r\ntest_facto -4 1 usage\r\ntest_facto 1.1 1 usage\r\n\r\n<\/pre>\n<p>Dans ce script nous testons differentes valeurs dont les cas d&#8217;erreurs. Pour utiliser lcov nous devons compiler notre code avec ces flags :<br \/>\n<strong>+=-fprofile-arcs -ftest-coverage <\/strong><\/p>\n<p>Enfin pour utiliser lcov\/gcov, nous commencons par executer notre script de test :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n.\/check_complete.sh\r\ngcov test_user_gcov\r\nlcov -o user_test.info -c -f -d .\r\ngenhtml -o user_result user_test.info\r\n<\/pre>\n<p>Gcov va g\u00e9n\u00e9rer les r\u00e9sultats tandis que lcov est une surcouche permettant d&#8217;exploiter les r\u00e9sultats sous forme de fichier html tr\u00e8s facile \u00e0 exploiter<\/p>\n<p><a href=\"http:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_user_incomplete.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-283\" title=\"gcov_user_incomplete\" src=\"http:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_user_incomplete.png\" alt=\"\" width=\"1280\" height=\"1024\" srcset=\"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_user_incomplete.png 1280w, https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_user_incomplete-300x240.png 300w, https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_user_incomplete-1024x819.png 1024w, https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-content\/uploads\/2012\/12\/gcov_user_incomplete-375x300.png 375w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><\/a><\/p>\n<p>Dans cette image nous pouvons voir que l&#8217;ensemble du code n&#8217;est pas test\u00e9, le code de valeur max n&#8217;est pas test\u00e9 ainsi que le cas ou le programme est appel\u00e9 avec un nombre incorrecte d&#8217;argument. Gcov analyse deux donn\u00e9es, le nombre de ligne de code test\u00e9, et aussi le nombre de branchement effectivement test\u00e9. Ainsi nous obtenons le nombre de fois qu&#8217;a \u00e9t\u00e9 ex\u00e9cut\u00e9 une ligne de code lors de nos tests ainsi que le d\u00e9tail sur chaque branchement possible de nos conditions. Ligne 33, nous pouvons voir que sur les 6 cas possible de la condition, 1 cas n&#8217;est pas test\u00e9 par la pr\u00e9sence d&#8217;un symbole &#8220;-&#8221; en rouge. Simple et efficace.<\/p>\n<p>De plus Gcov peut aussi \u00eatre utilis\u00e9 dans le cas d&#8217;un module noyau. Vous trouverez dans cette tarball un exemple complet pour utiliser gcov avec un programme utilisateur et en espace noyau avec la pr\u00e9sence d&#8217;un Makefile, le code (utilisateur et noyau), un configure pour v\u00e9rifier les pr\u00e9requis :<a href=\"http:\/\/arthurlambert.fr\/robotique\/gcov_example.tar.bz2\">gcov_example.tar.bz2<\/a><!--:--><!--:en--><\/p>\n<p><!--:--><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voici un outil bien pratique pour la phase de test d&#8217;un projet ou pour trouver du code mort : GCOV. En effet Gcov va nous permettre de voir le taux de couverture de nos jeux de tests en nous montrant &hellip; <a href=\"https:\/\/arthurlambert.fr\/robotique\/wordpress\/gcov-taux-de-couverture-dune-suite-de-test\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[78,79,72,76,73,80,75,74,77,12,13],"class_list":["post-277","post","type-post","status-publish","format-standard","hentry","category-tuto","tag-c","tag-exemple","tag-gcov","tag-kernel","tag-lcov","tag-profiling","tag-taux-de-couverture","tag-taux-de-couverture-noyau","tag-test","tag-tutorial","tag-tutoriel"],"_links":{"self":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts\/277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/comments?post=277"}],"version-history":[{"count":35,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts\/277\/revisions"}],"predecessor-version":[{"id":317,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/posts\/277\/revisions\/317"}],"wp:attachment":[{"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/media?parent=277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/categories?post=277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arthurlambert.fr\/robotique\/wordpress\/wp-json\/wp\/v2\/tags?post=277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}