<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Julien H &#187; Qualité</title>
	<atom:link href="https://blog.developpez.com/julienh/pcategory/java/qualite/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/julienh</link>
	<description></description>
	<lastBuildDate>Mon, 28 Feb 2011 15:13:41 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Comparatif des outils de mesure de couverture de code en Java</title>
		<link>https://blog.developpez.com/julienh/p8394/java/les_outils_de_mesure_de_couverture_de_co</link>
		<comments>https://blog.developpez.com/julienh/p8394/java/les_outils_de_mesure_de_couverture_de_co#comments</comments>
		<pubDate>Wed, 25 Nov 2009 13:00:00 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il existe plusieurs outils de mesure de la couverture de code en Java, dont certains open source. J&#8217;ai récemment été amené à comparer le fonctionnement des plus connus d&#8217;entre eux, et je vous livre ici les résultats bruts de ce comparatif. Je tenterai certainement une analyse dans un prochain billet. Tout d&#8217;abord, quelques notions de base. Les différentes métriques de couverture de code Je vous laisse lire l&#8217;article de Wikipedia (plus complet en EN) si [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il existe plusieurs outils de mesure de la couverture de code en Java, dont certains open source. J&rsquo;ai récemment été amené à comparer le fonctionnement des plus connus d&rsquo;entre eux, et je vous livre ici les résultats bruts de ce comparatif. Je tenterai certainement une analyse dans un prochain billet.</p>
<p>Tout d&rsquo;abord, quelques notions de base. </p>
<p><span id="more-7"></span></p>
<h4>Les différentes métriques de couverture de code</h4>
<p>Je vous laisse lire l&rsquo;article de <a href="http://fr.wikipedia.org/wiki/Couverture_de_code">Wikipedia</a> (<a href="http://en.wikipedia.org/wiki/Code_coverage">plus complet en EN</a>) si ça vous intéresse, mais sachez que les principales métriques utilisées (et utiles) sont :</p>
<ul>
<li>couverture des instructions (!= couverture de ligne)</li>
<li>couverture des branches (if/else, try/catch/finally, &#8230;)</li>
<li>couverture des expression booléennes (ou conditions)</li>
</ul>
<h4>Méthodes de mesure</h4>
<p>Pour mesurer la couverture de code en Java, il faut un moyen de détecter qu&rsquo;on est passé sur telle ligne/instruction/branche et pas sur une autre. Il existe plusieurs méthodes :</p>
<ul>
<li>L&rsquo;utilisation des API de profiling de la JVM (JVMDI/PI)</li>
<li>L&rsquo;instrumentation du bytecode</li>
<li>L&rsquo;instrumentation du code source</li>
</ul>
<p>Passons très vite sur la première méthode. Aucun des outils de mon comparatif ne l&rsquo;utilise. Son principal défaut semble être le surcoût au niveau des performances (overhead).</p>
<p>Reste donc les 2 méthodes d&rsquo;instrumentation. L&rsquo;instrumentation, c&rsquo;est le fait d&rsquo;enrichir le programme original avec des instructions supplémentaires. Ces instructions vont être les témoins que l&rsquo;on est bien passé à cet endroit du programme. Schématiquement, pour mesurer la couverture des lignes de code, il suffit d&rsquo;ajouter après chaque ligne du programme original un petit bout de code qui va dire &laquo;&nbsp;la ligne XXX a été exécutée&nbsp;&raquo;. Ce bout de code va stocker son information en mémoire ou dans un fichier, et à la fin, il suffit de collecter les données et de générer un beau rapport.</p>
<h5>L&rsquo;instrumentation du code source</h5>
<p>L&rsquo;instrumentation du code source va réellement modifier le code du programme avant de le compiler et de l&rsquo;exécuter.</p>
<p>Exemple (schématique) :</p>
<p>Avant instrumentation :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public int addition(int a, int b) { <br />
&nbsp; return a + b; <br />
}</div></div>
<p>Après instrumentation :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public int addition(int a, int b) { <br />
&nbsp; entering_method(&quot;addition&quot;); <br />
&nbsp; int tmp = a + b; <br />
&nbsp; statement(34); //34 = numero de ligne dans le programme original <br />
&nbsp; return tmp; <br />
}</div></div>
<p>N.B. : Je ne sais pas réellement ce qui est ajouté comme code, sachant que Clover est closed-source, donc ce n&rsquo;est qu&rsquo;indicatif.</p>
<h5>L&rsquo;instrumentation du bytecode</h5>
<p>L&rsquo;instrumentation du bytecode consiste à manipuler le code Java compilé (le fichier .class) pour y ajouter les instructions de &laquo;&nbsp;trace&nbsp;&raquo;. Le principe est donc le même que pour l&rsquo;instrumentation de code source, avec les différences suivantes :</p>
<p>Avantages :</p>
<ul>
<li>pas besoin de posséder les sources du programme (mais dans ce cas on aura que la couverture des méthodes, pas des lignes)</li>
<li>pas besoin de recompiler le programme, on modifie directement le .class</li>
</ul>
<p>Inconvénients :</p>
<ul>
<li>le bytecode n&rsquo;est pas exactement l&rsquo;image fidèle des lignes de code. Le compilateur effectue des optimisations qui peuvent rendre difficile de distinguer l&rsquo;exécution de lignes de code consécutives. Si le code est compilé avec l&rsquo;option debug, il est quand même possible de &laquo;&nbsp;deviner&nbsp;&raquo; la ligne de manière assez fiable</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Utilisation de l&#8217;annotation @Generated</title>
		<link>https://blog.developpez.com/julienh/p7928/java/utilisation_de_l_annotation_generated</link>
		<comments>https://blog.developpez.com/julienh/p7928/java/utilisation_de_l_annotation_generated#comments</comments>
		<pubDate>Wed, 05 Aug 2009 14:47:53 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui, j&#8217;ai découvert l&#8217;annotation javax.annotation.Generated. Je n&#8217;ai jamais vu d&#8217;utilisation concrète de cette annotation, et c&#8217;est bien dommage. Voici idéalement ce qui devrait exister&#8230; Les générateurs de code Tout d&#8217;abord, il faudrait que tous les outils qui génèrent du code fasse apparaître cette annotation. Voici quelques exemples (que j&#8217;utilise quotidiennement) : wsdl2java et les stubs Axis2 javacc Magic Draw (et tous les outils d&#8217;UML) XmlBeans Je pense que je vais soumettre cette idée dans les [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui, j&rsquo;ai découvert l&rsquo;annotation <a href="http://java.sun.com/javase/6/docs/api/javax/annotation/Generated.html">javax.annotation.Generated</a>. Je n&rsquo;ai jamais vu d&rsquo;utilisation concrète de cette annotation, et c&rsquo;est bien dommage.</p>
<p>Voici idéalement ce qui devrait exister&#8230;<br />
<span id="more-6"></span></p>
<p><strong>Les générateurs de code</strong></p>
<p>Tout d&rsquo;abord, il faudrait que tous les outils qui génèrent du code fasse apparaître cette annotation. Voici quelques exemples (que j&rsquo;utilise quotidiennement) :</p>
<ul>
<li>wsdl2java et les stubs Axis2</li>
<li>javacc</li>
<li>Magic Draw (et tous les outils d&rsquo;UML)</li>
<li>XmlBeans</li>
</ul>
<p>Je pense que je vais soumettre cette idée dans les différents bug trackers de ces outils, n&rsquo;hésitez pas à faire de même de votre côté.</p>
<p><strong>Les IDE</strong></p>
<p>Les IDE devraient exploiter cette balise en empêchant le développeur de modifier du code marqué comme @Generated. Bien sûr, le développeur peut retirer la balise et faire des modifs custo, mais dans ce cas le code devient du code qui sera considéré comme manuel. On peut même imaginer que les générateurs de code vérifient la présence de la balise avant d&rsquo;écraser le code lors de générations ultérieures.</p>
<p>Question subsidiaire : comment empêcher un fourbe développeur de supprimer l&rsquo;annotation, faire des modifs, puis remettre l&rsquo;annotation ???</p>
<p><strong>Les outils d&rsquo;analyse de code</strong></p>
<p>C&rsquo;est là que ça devient très intéressant. Dans ma société nous utilisons beaucoup d&rsquo;outils de mesure de la qualité du code. Liste non exhaustive :</p>
<ul>
<li>PMD</li>
<li>Checkstyle</li>
<li>Findbugs</li>
<li>Cobertura</li>
<li>Et Sonar pour piloter le tout</li>
</ul>
<p>Il est très pénible de devoir configurer chacun de ces outils pour ignorer le code généré. En effet, ce code ne doit pas rentrer dans l&rsquo;analyse d&rsquo;un projet, car souvent :</p>
<ul>
<li>Il fonctionne de manière fiable (ou alors c&rsquo;est un bug du générateur, pas du projet)</li>
<li>Le code généré ne respecte pas le code style du projet (donc checkstyle explose)</li>
<li>La couverture du code généré par les tests n&rsquo;est pas toujours intéressante</li>
</ul>
<p>Si tout ces outils pouvaient prendre en compte l&rsquo;annotation @Generated, ce serait génial.</p>
<p>Bonus : l&rsquo;annotation @Generated permet de spécifier l&rsquo;outil responsable de la génération. Par exemple @Generated(value=&nbsp;&raquo;axis2&Prime;). On pourrait donc finement configurer le code à ignorer en fonction du générateur.</p>
<p>Bonus 2 : l&rsquo;annotation @Generated peut se positionner non seulement sur une classe, mais également sur une méthode, un attribut, &#8230; Donc on pourrait au sein d&rsquo;une même classe distinguer le code généré du code manuel !!! Chose qui n&rsquo;est actuellement pas possible de configurer dans les outils que j&rsquo;utilise (en général on exclut un package complet de l&rsquo;analyse).</p>
<p>A suivre&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
