<?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>OCTO talks ! &#187; productivité</title>
	<atom:link href="http://blog.octo.com/tag/productivite/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Applications mobiles multi-plateformes: les approches PhoneGap et Titanium Mobile</title>
		<link>http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile</link>
		<comments>http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 05:10:28 +0000</pubDate>
		<dc:creator>François Petitit</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=26304</guid>
		<description><![CDATA[Introduction Le développement d&#8217;applications pour terminaux mobiles (iPhone, iPad, Android, Blackberry, Windows Phone, Nokia Symbian, Samsung Bada&#8230;) se heurte à la fragmentation des technologies de développements: environnement iOS/Objective-C pour l&#8217;iPhone et l&#8217;iPad, SDK Java spécifique pour Android, J2ME pour Symbian, etc. Deux approches possibles lorsque l&#8217;on débute un projet d&#8217;application ciblant plusieurs de ces plateformes [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
<li><a href='http://blog.octo.com/ce-que-jquery-mobile-nous-apprend-sur-le-web-mobile/' rel='bookmark' title='Ce que jQuery Mobile nous apprend sur le Web Mobile'>Ce que jQuery Mobile nous apprend sur le Web Mobile</a></li>
<li><a href='http://blog.octo.com/le-terminal-mobile-et-usabilite-ou-comment-reveiller-le-canal-web-et-les-applications-desktop/' rel='bookmark' title='Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop'>Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fapplications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fpp1xHQ%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Applications%20mobiles%20multi-plateformes%3A%20les%20approches%20PhoneGap%20et%20Titanium%20Mobile%22%20%7D);"></div>
<h2>Introduction</h2>
<p>Le développement d&#8217;applications pour terminaux mobiles (iPhone, iPad, Android, Blackberry, Windows Phone, Nokia Symbian, Samsung Bada&#8230;) se heurte à la fragmentation des technologies de développements: environnement iOS/Objective-C pour l&#8217;iPhone et l&#8217;iPad, SDK Java spécifique pour Android, J2ME pour Symbian, etc.</p>
<p>Deux approches possibles lorsque l&#8217;on débute un projet d&#8217;application ciblant plusieurs de ces plateformes sont de développer une application pour chacune d&#8217;elle, ou de développer un site Web compatible.</p>
<p>Dans le premier cas, l&#8217;inconvénient concerne bien évidemment le coût des développements. Dans le deuxième, on sera limité en richesse de l&#8217;application par les possibilités du Web.</p>
<p>Ce fut l&#8217;objet d&#8217;un précédent article sur notre blog: <a title="http://blog.octo.com/debat-web-apps-vs-natif/" href="http://blog.octo.com/debat-web-apps-vs-natif/" target="_blank">http://blog.octo.com/debat-web-apps-vs-natif/</a>.</p>
<p>Entre ces deux approches se situe une offre assez fournie de solutions de développement multi-plateforme, proposées par des éditeurs proposant leurs propres plateformes d&#8217;exécution et leurs outils de développement.</p>
<p>Parmi celles-ci, nous nous sommes concentrés dans cet article sur PhoneGap et Titanium Mobile, qui sont aujourd&#8217;hui parmi les plus abouties et sont représentatives des deux principales approches de développement multi-plateforme: l&#8217;utilisation des moteurs de rendus Web pour PhoneGap, et la translation de code source vers la plateforme cible pour Titanium.<br />
<span id="more-26304"></span></p>
<h2>Présentation des solutions</h2>
<h3><a href="http://www.phonegap.com/">PhoneGap</a></h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/10/PhoneGap.gif"><img src="http://blog.octo.com/wp-content/uploads/2011/10/PhoneGap.gif" alt="logo PhoneGap" title="PhoneGap" width="192" height="72" class="alignleft size-full wp-image-26313" /></a>Nitobi, l&#8217;éditeur de PhoneGap, a annoncé <a href="http://www.phonegap.com/2011/10/03/nitobi-enters-into-acquisition-agreement-with-adobe-2/">son rachat par Adobe</a> le 3 octobre 2011. Cela confirme l&#8217;intérêt que l&#8217;on peut avoir envers cette solution, même si ce rachat surprise apporte une certaine incertitude sur l&#8217;avenir de PhoneGap.<br />
PhoneGap est un outil open-source, et devrait d&#8217;ailleurs rejoindre la fondation Apache.<br />
Le principe de PhoneGap est de <strong>fournir des API JavaScript aux navigateurs Web standards, permettant d&#8217;appeler des fonctionnalités natives non disponibles autrement</strong>: accéder à l&#8217;appareil photo, à l&#8217;accéléromètre, au système de fichiers&#8230;<br />
Cela <strong>nécessite d&#8217;embarquer le code source HTML/CSS/JS dans une application native</strong>, grâce au composant permettant d&#8217;inclure une vue Web dans une application, disponible dans chaque SDK.</p>
<h3><a href="http://www.appcelerator.com/products/titanium-mobile-application-development/">Titanium</a></h3>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/10/APPC_logo.png"><img class="alignleft size-full wp-image-26315" title="APPC_logo" src="http://blog.octo.com/wp-content/uploads/2011/10/APPC_logo.png" alt="logo Appcelerator" width="177" height="40" /></a>Développé par Appcelerator qui vend du support et des formations sur Titanium, c&#8217;est également une solution libre.</p>
<p>Le principe de Titanium est de <strong>fournir une machine virtuelle JavaScript permettant d&#8217;accéder au système natif</strong>, et ainsi de développer des applications natives mais en JavaScript. C&#8217;est la promesse d&#8217;applications plus réactives et à l&#8217;expérience utilisateur plus proche du natif que celles basées sur des pages Web, comme PhoneGap.</p>
<h2>Points communs</h2>
<p>L&#8217;intérêt principal de l&#8217;utilisation d&#8217;une plateforme de développement multi-plateforme comme PhoneGap et Titanium Mobile réside en 2 points:</p>
<ul>
<li><strong>pouvoir déployer l&#8217;application sur les magasins (AppStore, Android Market&#8230;)</strong> afin de bénéficier de ce canal de distribution et de communication. Cela est réellement assuré par ces deux outils;</li>
<li><strong>réduire les coûts de développements en mutualisant du code</strong>. Cela est assuré par ces deux outils à condition de bien les utiliser et de limiter la part des développements spécifiques à chaque plateforme et donc de se limiter aux fonctionnalités supportées &laquo;&nbsp;out of the box&nbsp;&raquo;. On rogne donc sur l&#8217;expérience utilisateur et la richesse fonctionnelle.</li>
</ul>
<h2>Comparaison</h2>
<h3>Plateformes supportées</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px; vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>iOS, Android, BlackBerry, Bada, WindowsPhone, WebOS, Symbian</td>
<td>iOS, Android et depuis très récemment BlackBerry</td>
</tr>
</tbody>
</table>
<h4>Notre avis: </h4>
<p><strong>En pratique, les développements PhoneGap nécessitent des adaptations pour chaque plateforme</strong>, dont les capacités et l&#8217;expérience utilisateurs diffèrent fortement. Etant donné l&#8217;état du marché (avec l&#8217;écrasante domination de l&#8217;<strong>iPhone</strong>, d&#8217;<strong>Android</strong> et de <strong>Blackberry</strong>), <strong>on ciblera généralement ces 3 plateformes uniquement</strong>. C&#8217;est ce que l&#8217;on a pu constater dans la plupart des cas où une entreprise ciblait initialement toutes les plateformes: l&#8217;augmentation du coût pour les supporter au fur et à mesure rendait cela impossible et finalement, au maximum, seules les 3 ou 4 principales étaient vraiment adressées.<br />
Concernant Titanium, le support de Blackberry est encore récent et disponible uniquement sous Windows, alors que la plupart des développeurs mobiles sont sous Mac (pour l&#8217;iPhone). Cela est dommage mais on espère que ce sera bientôt résolu.<br />
Pour cibler tous les terminaux mobiles à moindre coût, le meilleur moyen reste de réaliser un site Web simple, qui permet de diffuser de l&#8217;information mais ne permet ni de fournir des fonctionnalités avancées (appareil photo, etc.), ni de proposer une expérience utilisateur riche, ni d&#8217;être visible sur l&#8217;AppStore.</p>
<h3>Richesse de la plateforme</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px; vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>Possibilités des navigateurs Web + API PhoneGap (principalement appareil photo, système de fichier, accéléromètre, liste des contacts, géolocalisation)
</td>
<td>Accès aux composants d&#8217;IHM natifs + API Titanium (base de données, géolocalisation, gestion des contacts, intégration Facebook, appareil photo, lecture et enregistrement audio/vidéo&#8230;)
</td>
</tr>
</tbody>
</table>
<h4>Notre avis: </h4>
<p><strong>Titanium est indéniablement plus riche fonctionnellement</strong> et fournira une apparence <strong>plus proche du natif</strong>, ce qui est en général l&#8217;objectif des concepteurs d&#8217;applications.<br />
PhoneGap est dans l&#8217;absolu plus limité en terme de fonctionnalités, et on doit concevoir les écrans comme des pages Web et non des écrans natifs. C&#8217;est d&#8217;ailleurs une erreur que l&#8217;on retrouve souvent sur les projets mobiles utilisant des technologies Web:<strong> il ne faut surtout pas tenter de reproduire des comportements natifs, mais plutôt viser des comportements Web performants</strong>.<br />
<strong>Les deux plateformes sont extensibles</strong>, Titanium plus facilement que PhoneGap, mais <strong>nous déconseillons globalement</strong> d&#8217;aller dans cette direction car cela devient très coûteux à maintenir (on estime en général à 20% la part maximale de code spécifique tolérable), et nécessite en outre encore plus de compétences que de faire des applications natives spécifiques à chaque plateforme.</p>
<h3>Plateforme de développement</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>HTML/CSS/JavaScript standard. On développe comme si c&#8217;était une application Web normale. Les API PhoneGap sont bien documentées, par-contre on devra chercher sur le Web la documentation pour les technologies HTML/CSS/JS et les éventuelles librairies JavaScript utilisées.</td>
<td>JavaScript en utilisant des API spécifiques à Titanium, que ce soit pour créer les IHM ou pour écrire des appels au système. Le site d&#8217;Appcelerator propose la documentation des API ainsi qu&#8217;une application démo (<a href="http://developer.appcelerator.com/doc/kitchensink">KitchenSink</a>) et des vidéos.</td>
</tr>
</tbody>
</table>
<h4>Notre avis:</h4>
<p>On remarque l&#8217;<strong>utilisation de plus en plus large de JavaScript</strong>, un langage décrié par ses côtés peu structuré et trop tolérant. Il est nécessaire, pour développer ce type d&#8217;applications, de <strong>se former profondément à JavaScript</strong> et de <strong>connaître les design patterns de structuration/modularisation</strong> du code dans ce langage, qui existent mais sont souvent mal connus des développeurs.<br />
C&#8217;est d&#8217;ailleurs le principal objet de la formation à Titanium donnée par leur expert <a href="http://www.appcelerant.com/appcelerator-community-member-spotlight-qa-with-kevin-whinnery.html" class="broken_link">Kevin Whinnery</a>, que nous avons eu la chance de suivre à l&#8217;<a href="http://updateconf.com/">UpdateConf 2011</a>.<br />
De manière globale, <strong>l&#8217;environnement de développement de Titanium est mieux intégré et plus documenté</strong>.</p>
<h3>Productivité des développement</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>PhoneGap nécessite de développer pour chaque plateforme ciblée dans l&#8217;IDE correspondant, et ne fournit pas d&#8217;outils supplémentaires.</td>
<td>Titanium fourni un IDE dédié, basé sur Aptana, un des meilleurs IDE Web reposant lui-même sur Eclipse (acheté récemment par Appcelerator)
</td>
</tr>
</tbody>
</table>
<h4>Notre avis:</h4>
<p>Titanium fournit un environnement de développement &laquo;&nbsp;clé en main&nbsp;&raquo; et performant, là où PhoneGap nécessite d&#8217;installer et configurer soi-même plusieurs environnements.<br />
<strong>La productivité est clairement côté Titanium</strong> aujourd&#8217;hui.</p>
<h3>Gestion des déploiements</h3>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%;}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;vertical-align: top;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">PhoneGap</th>
<th style="width:50%">Titanium</th>
</tr>
<tr>
<td>PhoneGap propose depuis peu un outil de build sur le cloud: <a href="https://build.phonegap.com/" title="PhoneGap Build">PhoneGap Build</a>, qui compile un projet PhoneGap vers les différentes plateformes cibles, que vous pourrez ensuite publier sur l&#8217;AppStore, l&#8217;Android Market, etc.</td>
<td>Titanium ne fournit pas d&#8217;outil de packaging multi-plateforme. Vous devrez donc créer manuellement les packages applicatifs.</td>
</tr>
</tbody>
</table>
<h4>Notre avis:</h4>
<p><strong>L&#8217;automatisation du packaging et de la livraison des applications</strong> sur les différentes plateformes (magasins publics type AppStore ou comptes privés &laquo;&nbsp;in house&nbsp;&raquo;) <strong>est un véritable enjeu</strong> concernant la productivité des développements et le coût global d&#8217;un projet. C&#8217;est d&#8217;ailleurs pour cela qu&#8217;<strong>OCTO propose <a href="http://www.appaloosa-store.com/" title="Appaloosa">Appaloosa</a></strong>, qui facilite la distribution en entreprise d&#8217;applications mobiles dans des <em>stores</em> privés.<br />
L&#8217;outil PhoneGap Build (compatible uniquement avec les applications PhoneGap), qui vient d&#8217;être ouvert en version finale, était une véritable nécessité.</p>
<h2>Synthèse</h2>
<p><br/></p>
<style type="text/css">
#table_fct_html5 {border-collapse: separate; border-spacing: 2px; width:100%}
#table_fct_html5 th {padding: 6px 12px; text-align: left}
#table_fct_html5 td {padding: 6px 12px;}
#table_fct_html5 td:last-child, th:last-child {text-align: left;}
#table_fct_html5 tr:nth-child(odd){background: #eee;}
#table_fct_html5 tr:nth-child(even){background: #ddd;}
#table_fct_html5 tr:first-child {background: #cba; color:white;}
#table_fct_html5 td:empty {background: white;}
</style>
<table id="table_fct_html5" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="width:50%">Fonctionnalité</th>
<th style="width:50%">Synthèse</th>
</tr>
<tr>
<td>Plateformes supportées</td>
<td>Avantage PhoneGap</td>
</tr>
<tr>
<td>Richesse (fonctionnalités + IHM)</td>
<td>Avantage Titanium</td>
</tr>
<tr>
<td>Langage de développement</td>
<td>Egalité</td>
</tr>
<tr>
<td>Productivité des développements</td>
<td>Avantage Titanium</td>
</tr>
<tr>
<td>Gestion des déploiements</td>
<td>Avantage PhoneGap</td>
</tr>
</tbody>
</table>
<p>Les points forts de PhoneGap sont donc aujourd&#8217;hui son support de plus de 6 plateformes, et le fait qu&#8217;il utilise au maximum les technologies standards du Web.<br />
Ses points faibles concernent ses limitations fonctionnelles et sa moindre richesse d&#8217;IHM du fait qu&#8217;il n&#8217;utilise pas les composants natifs, ainsi que son manque d&#8217;outillage de développement.</p>
<p>Les points forts de Titanium sont sa richesse fonctionnelle et graphique, ainsi que la productivité de son environnement de développement.<br />
Son point faible concerne le peu de plateformes supportées.</p>
<h2>Conclusion</h2>
<p>En conclusion, on a pu voir que <strong>Titanium est globalement plus productif et fournit plus de fonctionnalités que PhoneGap</strong> dans le but de développer des applications mobiles multi-plateformes. On le préfèrera en général, si l&#8217;on ne doit pas supporter plus que iOS + Android + BlackBerry.<br />
Au-delà du choix de l&#8217;outil, notre conseil majeur restera d&#8217;<strong>utiliser les outils pour ce qu&#8217;ils savent faire</strong>, et<strong> éviter de &laquo;&nbsp;tordre&nbsp;&raquo; leur usage</strong> pour leur faire faire autre chose ou de manière différente. Cela s&#8217;approche des problématiques bien connues d&#8217;utilisation trop personnalisée de progiciels, qui rend rapidement très coûteuse la moindre évolution.</p>
<p>Et d&#8217;ors et déjà, le choix de la technologie de développement multi-plateformes doit aussi se faire par-rapport aux applications Web HTML5 qui apportent de plus en plus de fonctionnalités et viennent sérieusement concurrencer les approches natives et hybrides, et les solutions Web existantes comme les moteurs de rendus (<a href="http://www.backelite.com/bkrender.php">BkRender</a>, <a href="http://www.wokup.com/">Wokup</a>) et les nombreux frameworks Web pour mobiles (par exemple <a href="http://www.sencha.com/products/touch/">Sencha Touch</a>.</p>
<p>La problématique du développement mobile multi-plateforme est loin d&#8217;être encore résolue, et nul doute que nous reviendrons encore dessus rapidement car c&#8217;est un enjeu fort pour les entreprises aujourd&#8217;hui.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=26304" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
<li><a href='http://blog.octo.com/ce-que-jquery-mobile-nous-apprend-sur-le-web-mobile/' rel='bookmark' title='Ce que jQuery Mobile nous apprend sur le Web Mobile'>Ce que jQuery Mobile nous apprend sur le Web Mobile</a></li>
<li><a href='http://blog.octo.com/le-terminal-mobile-et-usabilite-ou-comment-reveiller-le-canal-web-et-les-applications-desktop/' rel='bookmark' title='Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop'>Le terminal mobile et usabilité ou comment réveiller le canal web et les applications desktop</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/applications-mobiles-multi-plateformes-les-approches-phonegap-et-titanium-mobile/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>J&#8217;ai l&#8217;impression d&#8217;écrire mes tests en double !</title>
		<link>http://blog.octo.com/jai-limpression-decrire-mes-tests-en-double/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jai-limpression-decrire-mes-tests-en-double</link>
		<comments>http://blog.octo.com/jai-limpression-decrire-mes-tests-en-double/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 15:00:55 +0000</pubDate>
		<dc:creator>Benoît de CHATEAUVIEUX</dc:creator>
				<category><![CDATA[Accompagnement de projets]]></category>
		<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Méthodologie et conduite du changement]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[Spécifications par les tests]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tests automatisés]]></category>
		<category><![CDATA[tests de recette]]></category>
		<category><![CDATA[tests unitaires]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=23219</guid>
		<description><![CDATA[En présentant les tests fonctionnels automatisés chez un client la semaine dernière, plusieurs questions ont été soulevées. La principale était celle-ci: - Pourquoi écrire ces tests FitNesse/GreenPepper alors que j&#8217;ai déjà des tests unitaires JUnit qui couvrent la même fonctionnalité ? La question est justifiée. Voici quelques éléments de réponse, tirés de nos échanges sur [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/tests-par-proprietes/' rel='bookmark' title='Tests par propriétés'>Tests par propriétés</a></li>
<li><a href='http://blog.octo.com/rails-tests/' rel='bookmark' title='Rails += Tests'>Rails += Tests</a></li>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fjai-limpression-decrire-mes-tests-en-double%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22J%27ai%20l%27impression%20d%27%C3%A9crire%20mes%20tests%20en%20double%20%21%22%20%7D);"></div>
<p>En présentant les tests fonctionnels automatisés chez un client la semaine dernière, plusieurs questions ont été soulevées. La principale était celle-ci:</p>
<p><em>- Pourquoi écrire ces tests FitNesse/GreenPepper alors que j&#8217;ai déjà des tests unitaires JUnit qui couvrent la même fonctionnalité ?</em></p>
<div style="text-align: center;"><img class="size-full wp-image-23222 aligncenter" title="JUnit vs FitNesse" src="http://blog.octo.com/wp-content/uploads/2011/06/JuVsFit.jpg" alt="JUnit vs FitNesse" width="400" height="141" /></div>
<p>La question est justifiée. Voici quelques éléments de réponse, tirés de nos échanges sur les mailing-lists OCTO&#8230;</p>
<p><span id="more-23219"></span></p>
<h3 style="padding-top: 30px;">Des tests différents pour des acteurs différents</h3>
<p>Tout d&#8217;abord, parce que les tests unitaires et les tests fonctionnels sont écrits par des <strong>personnes différentes</strong>.</p>
<p>Les tests unitaires sont écrit et utilisés par les <strong>développeurs</strong>. Ils sont codés dans le même langage que l&#8217;application testée, leur exécution est rapide, ils sont régulièrement refactorés, modularisés, etc. Ils sont <strong>non négociables (!)</strong> et doivent tester l&#8217;intégralité du code applicatif.</p>
<p>Mais ces tests unitaires ne sont pas appréhendables par les fonctionnels (client, MOA, AMOA, etc.)</p>
<p>Et c&#8217;est là qu&#8217;interviennent les <a href="http://blog.octo.com/demarches-de-tests-fonctionnels/">tests fonctionnels automatisés</a>: ils sont écrits par les <strong>fonctionnels </strong>et sont &laquo;&nbsp;lisibles par un humain&nbsp;&raquo;.</p>
<p>Finalement, &laquo;&nbsp;s&#8217;il y a des doublons, c&#8217;est une coïncidence, en quelque sorte :)&nbsp;&raquo;.</p>
<p><img class="aligncenter size-full wp-image-23225" style="float: left; padding-right: 10px;" title="Tests en double" src="http://blog.octo.com/wp-content/uploads/2011/06/double.gif" alt="Tests en double" width="97" height="60" /><strong><span style="text-decoration: underline;">Idée</span></strong>:  On a vraiment des <strong>doublons</strong>, lorsque, sur un projet, ce sont les développeurs qui font aussi les tests fonctionnels et qu&#8217;ils sont les seuls à  les lire ou les mettre à jour. Dans ce cas, il est intéressant de se poser la question de l&#8217;utilité de ces tests: il y a fort à parier qu&#8217;on pourrait se contenter de tests développeurs JUnit.</p>
<h3 style="padding-top: 30px;">Des différences de granularité</h3>
<p><img class="aligncenter size-full wp-image-23229" style="float: left;" title="Boite blanche" src="http://blog.octo.com/wp-content/uploads/2011/06/blanche2.gif" alt="Boite blanche" width="63" height="56" />Les tests unitaires et les tests fonctionnels sont également différents dans leur granularité: les tests unitaires sont &laquo;&nbsp;<strong>boite blanche</strong>&nbsp;&raquo; (c&#8217;est à dire qu&#8217;ils testent le code&#8230; &laquo;&nbsp;ils regardent sous le capot&nbsp;&raquo;)&#8230;<br />
<img class="aligncenter size-full wp-image-23240" style="float: right; padding-left: 5px;" title="Boite grise" src="http://blog.octo.com/wp-content/uploads/2011/06/grise.gif" alt="Boite grise" width="63" height="58" /><br />
alors que les tests fonctionnels sont &laquo;&nbsp;<strong>boite noire</strong>&nbsp;&raquo; (ils testent l&#8217;application de bout en bout). Si les tests se ressemblent trop dans leur structure ou leurs assertions, c&#8217;est probablement que leur granularité est à retravailler.</p>
<p><span style="text-decoration: underline;"><strong>Idée 1</strong>:</span> On rencontre sur beaucoup de projet des tests &laquo;&nbsp;boite noire&nbsp;&raquo; développés avec JUnit: ce sont les <strong>tests d&#8217;intégration</strong>. Ils passent par plusieurs services, DAOs, par la base de données, etc. Ces tests sont utiles car ils permettent de tester la communication entre les couches, la configuration, etc. Mais ils sont généralement lents à exécuter. Il faut donc les utiliser avec précaution !<br />
Deux raisons possibles à l&#8217;utilisation massive de ces tests d&#8217;intégration: ou bien le projet ne dispose pas d&#8217;outils dédiés aux tests &laquo;&nbsp;boite noire&nbsp;&raquo; (FitNesse, GreenPepper, Selenium, etc.), ou bien ceci est dû à une méconnaissance des outils de Mock et des pratiques associées. Quelle qu&#8217;en soit la cause, limiter le nombre de ces tests &laquo;&nbsp;d&#8217;intégration&nbsp;&raquo; au profit de tests plus &laquo;&nbsp;unitaires&nbsp;&raquo; permet de réduire considérablement la durée globale d&#8217;exécution des tests. Et avoir des tests rapides, cela permet de les exécuter souvent, et donc de détecter les anomalies plus tôt.</p>
<p><span style="text-decoration: underline;"><strong>Idée 2</strong>:</span> <strong>Séparer les tests unitaires (rapides) des tests d&#8217;intégration (lents)</strong> est une bonne pratique. Ceci peut se faire par convention de nommage des classes de test, répertoires séparés, annotations ou autre. Une fois les tests JUnit catégorisés, des outils comme Maven permettent de définir des règles du type &laquo;&nbsp;les tests unitaires se lancent sur le poste développeur, les tests d&#8217;intégration s&#8217;exécutent uniquement sur le serveur d&#8217;intégration continue&nbsp;&raquo;. Cette séparation permet d&#8217;éviter le travers (récurrent) suivant: &laquo;&nbsp;les tests sont trop longs, je ne les exécute pas localement et les délègue à l&#8217;intégration continue&nbsp;&raquo;.</p>
<h3 style="padding-top: 30px;">Des objectifs différents et complémentaires</h3>
<p>Enfin, et c&#8217;est le <strong>point le plus important</strong>, les tests unitaires et les tests fonctionnels automatisés poursuivent des objectifs complémentaires:</p>
<ul>
<li style="padding-bottom: 10px;">Les tests unitaires
<ul>
<li>favorisent la <strong>collaboration entre les développeurs</strong></li>
<li>améliorent la <strong>productivité </strong>des développements</li>
<li>assurent un harnais de test permettant le <strong>refactoring </strong>&laquo;&nbsp;sans stress&nbsp;&raquo;</li>
</ul>
</li>
<li>Les tests fonctionnels automatisés, quant à eux
<ul>
<li>permettent de <strong>spécifier le produit</strong> en un endroit/format unique en <strong>détaillant les subtilités</strong> qui n&#8217;apparaissent pas dans les simples User Stories, avec des données de test qui ont un sens &laquo;&nbsp;métier&nbsp;&raquo;</li>
<li>favorisent la <strong>communication entre le client et l&#8217;équipe de développement</strong></li>
<li>représentent un harnais de test garantissant la<strong> non-régression fonctionnelle</strong></li>
</ul>
</li>
</ul>
<h3 style="padding-top: 30px;">A retenir</h3>
<p>Nos projets intègrent <a href="http://blog.octo.com/quels-sont-les-types-de-tests-que-l%E2%80%99on-utilise-sur-un-projet-agile/">plusieurs types de tests</a>.<br />
Parmi eux, les tests unitaires et les tests fonctionnels couvrent les mêmes fonctionnalités, il est donc normal d&#8217;avoir le sentiment qu&#8217;ils se recoupent parfois.</p>
<p>Cependant, ils sont écrits par des personnes différentes, avec des niveaux de granularité différents et, surtout, des objectifs complémentaires:<br />
- <strong>Faire bien le produit</strong>, pour les uns<br />
- <strong>Faire le bon produit</strong>, pour les autres</p>
<p>En revanche, c&#8217;est au niveau des tests unitaires ou d&#8217;intégration qu&#8217;il est important de commencer la chasse aux doublons ! La durée de votre build ne s&#8217;en portera que mieux!</p>
<p>&nbsp;</p>
<p style="font-size: 0.9em;"><em>Un grand merci à Ismaël Héry, Julien Jakubowski, Eric Pantera, Arnaud Huon, Rémy-Christophe Schermesser, Christophe Thibault, Henri Tremblay, Maria-Dolores Manzanedo, Sylvain Fagnent, Bertrand Paquet, Sylvain Mazaleyrat et Florian Marin pour ces échanges et retours d&#8217;expérience enrichissants !</em></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=23219" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/tests-par-proprietes/' rel='bookmark' title='Tests par propriétés'>Tests par propriétés</a></li>
<li><a href='http://blog.octo.com/rails-tests/' rel='bookmark' title='Rails += Tests'>Rails += Tests</a></li>
<li><a href='http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/' rel='bookmark' title='FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance'>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/jai-limpression-decrire-mes-tests-en-double/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Du TDD pour Silverlight aussi !</title>
		<link>http://blog.octo.com/du-tdd-pour-silverlight-aussi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=du-tdd-pour-silverlight-aussi</link>
		<comments>http://blog.octo.com/du-tdd-pour-silverlight-aussi/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 20:40:09 +0000</pubDate>
		<dc:creator>Nicolas Raynaud</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=23432</guid>
		<description><![CDATA[A moins de s&#8217;être limité à dessiner des ronds et des carrés avec Silverlight, vous avez sans doute déjà tenté d&#8217;utiliser un des templates de projets du Silverlight Toolkit permettant de faire des tests unitaires pour vos applications RIA! Plein de bonne volonté, vous vous êtes heurtés aux multiples inconvénients de cette solution : Framework [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/flex-vs-silverlight/' rel='bookmark' title='Flex vs Silverlight'>Flex vs Silverlight</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-les-1920-et-21-janvier/' rel='bookmark' title='Formation Silverlight Tour à Paris les 19,20 et 21 janvier'>Formation Silverlight Tour à Paris les 19,20 et 21 janvier</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-%e2%80%93-28-29-30-avril/' rel='bookmark' title='Formation Silverlight Tour à Paris – 28, 29, 30 Avril'>Formation Silverlight Tour à Paris – 28, 29, 30 Avril</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fdu-tdd-pour-silverlight-aussi%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Du%20TDD%20pour%20Silverlight%20aussi%20%21%22%20%7D);"></div>
<p>A moins de s&#8217;être limité à dessiner des ronds et des carrés avec Silverlight, vous avez sans doute déjà tenté d&#8217;utiliser un des templates de projets du <a href="http://silverlight.codeplex.com/">Silverlight Toolkit</a> permettant de faire des tests unitaires pour vos applications RIA! Plein de bonne volonté, vous vous êtes heurtés aux multiples inconvénients de cette solution :</p>
<ul>
<li>Framework de tests spécifique à Silverlight</li>
<li>Obligation de lancer une application &laquo;&nbsp;conteneur&nbsp;&raquo; pour lancer vos tests</li>
<li>Usabilité plus que discutable de cette même application</li>
<li>Impossibilité d&#8217;utiliser une métrique comme la couverture de code</li>
<li>et j&#8217;en passe&#8230;</li>
</ul>
<p>N&#8217;abandonnez pas encore ! Je vous proposer ici une solution pour venir à bout de ces limitations&#8230; plus d&#8217; excuses, vous pourrez tout tester &#8230;</p>
<p style="text-align: center;"><a href="http://blog.octo.com/en/design-your-silverlight-application-for-tdd/">la suite par ici en anglais</a>&#8230;</p>
<p>&nbsp;</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=23432" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/flex-vs-silverlight/' rel='bookmark' title='Flex vs Silverlight'>Flex vs Silverlight</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-les-1920-et-21-janvier/' rel='bookmark' title='Formation Silverlight Tour à Paris les 19,20 et 21 janvier'>Formation Silverlight Tour à Paris les 19,20 et 21 janvier</a></li>
<li><a href='http://blog.octo.com/formation-silverlight-tour-a-paris-%e2%80%93-28-29-30-avril/' rel='bookmark' title='Formation Silverlight Tour à Paris – 28, 29, 30 Avril'>Formation Silverlight Tour à Paris – 28, 29, 30 Avril</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/du-tdd-pour-silverlight-aussi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un workspace Eclipse standardisé</title>
		<link>http://blog.octo.com/workspace-eclipse-standardise/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=workspace-eclipse-standardise</link>
		<comments>http://blog.octo.com/workspace-eclipse-standardise/#comments</comments>
		<pubDate>Sun, 12 Dec 2010 21:06:30 +0000</pubDate>
		<dc:creator>Nicolas De Nayer</dc:creator>
				<category><![CDATA[Accompagnement de projets]]></category>
		<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[environnement]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[standard]]></category>
		<category><![CDATA[workspace]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=18492</guid>
		<description><![CDATA[Uniformiser vos environnements de développement &#8211; Gagner en productivité Marre des merges galères pour cause de formateurs différents ? Marre qu&#8217;un membre de l&#8217;équipe commit en UTF-8, l&#8217;autre en ISO-8859-1 ? Marre de reconfigurer la JDK, Checkstyle, PMD, le repo SVN, le proxy de la boite, et des millions de paramètres à chaque création d&#8217;un [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/environnement-de-developpement-maveneclipse-pour-gwt-17/' rel='bookmark' title='Environnement de développement Maven/Eclipse pour GWT 1.7'>Environnement de développement Maven/Eclipse pour GWT 1.7</a></li>
<li><a href='http://blog.octo.com/25-minutes-pour-creer-un-plugin-text-editor-pour-eclipse/' rel='bookmark' title='60 minutes pour créer un plugin Text Editor pour Eclipse'>60 minutes pour créer un plugin Text Editor pour Eclipse</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fworkspace-eclipse-standardise%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Un%20workspace%20Eclipse%20standardis%C3%A9%22%20%7D);"></div>
<h2 style="text-align: left;">Uniformiser vos environnements de développement &#8211; Gagner en productivité</h2>
<h2 style="text-align: left;"><span style="font-weight: normal; font-size: 13px;">Marre des merges galères pour cause de formateurs différents ?</span></h2>
<div id="_mcePaste" style="text-align: justify;">
<ul>
<li style="text-align: justify;">Marre qu&#8217;un membre de l&#8217;équipe commit en UTF-8, l&#8217;autre en ISO-8859-1 ?</li>
<li style="text-align: justify;">Marre de reconfigurer la JDK, Checkstyle, PMD, le repo SVN, le proxy de la boite, et des millions de paramètres à chaque création d&#8217;un nouveau workspace ?</li>
</ul>
</div>
<p><strong>Ce tip &amp; trick est pour vous !</strong></p>
<div style="text-align: justify;"><span id="more-18492"></span></div>
<div id="_mcePaste" style="text-align: justify;">Vous savez qu&#8217;Eclipse stocke toute cette configuration dans le répertoire &laquo;&nbsp;.metadata&nbsp;&raquo; du workspace. Je vous propose donc de créer un Generic-Metadata.zip pour tous les membres de votre projet.</div>
<div id="_mcePaste" style="text-align: justify;">Le but étant que chacun puisse créer son workspace avec une configuration identique et ce en deux clics ! Libre à lui, ensuite, de remettre rose sa couleur de police&#8230;</div>
<h3 style="text-align: justify;">Comment créer ce Zip ?</h3>
<div id="_mcePaste" style="text-align: justify;">
<ul>
<li>Créez un nouveau workspace Eclipse.</li>
<li>Faites tous les réglages que vous souhaitez.</li>
<p><em>Attention, ils doivent être indépendants de la machine. En effet, si vous faites un réglage qui pointe vers &nbsp;&raquo; C:\Users\Nicolas&nbsp;&raquo; cela risque de mettre à mal la généricité&#8230; C&#8217;est la seule contrainte.</em></p>
<li>Fermez votre Eclipse.</li>
<li>Il ne vous reste plus qu&#8217;à zipper le répertoire .metadata présent dans le workspace (il ne doit, d&#8217;ailleurs, y avoir que ce répertoire) et placer le fichier Generic-Metadata.zip sur un répertoire partagé par tout le projet.</li>
</ul>
</div>
<h3 style="text-align: justify;">Comment utiliser ce Zip ?</h3>
<div id="_mcePaste" style="text-align: justify;">
<ul>
<li>Créez le répertoire de votre futur workspace à la main (il ne doit pas y avoir de .metadata).</li>
<li>Dezippez le zip dans ce répertoire (le répertoire .metadata se trouve maintenant à la base du workspace).</li>
<li>Vous n&#8217;avez plus qu&#8217;à ouvrir votre workspace via Eclipse.</li>
</ul>
</div>
<h3 style="text-align: justify;">Que peut-on y mettre ?</h3>
<h3 style="text-align: justify;"><span style="font-weight: normal; font-size: 13px;">Voici ce que je positionne en général dans ce Zip :</span></h3>
<div id="_mcePaste" style="text-align: justify;">
<div id="_mcePaste" style="text-align: justify;">
<ul>
<li>le formateur officiel de l&#8217;entreprise</li>
<li>les fichiers de configuration Checkstyle/PMD de l&#8217;entreprise</li>
<li>l&#8217;encodage</li>
<li>les actions automatiquement lancées à chaque sauvegarde de fichier (organisation des imports, formatage, etc.)</li>
<li>le dépôt SVN du projet</li>
<li>la JDK (tous les postes de développement doivent donc l&#8217;avoir installée de façon homogène)</li>
<li>le proxy de l&#8217;entreprise</li>
</ul>
</div>
<h3 style="text-align: justify;">Conclusion</h3>
<p><span style="font-weight: normal; font-size: 13px;">Rien d&#8217;exceptionnel dans cette pratique, mais dans une perspective d&#8217;amélioration de la productivité, je trouve que son gain est colossal pour un coût dérisoire.</span></p>
<h3 style="text-align: justify;">Dangers &amp; Conseils</h3>
<h4 style="text-align: justify;">-pourquoi un Zip ?</h4>
<div id="_mcePaste" style="text-align: justify;">Premièrement ce répertoire .metadata est constitué de nombreux fichiers. En cas de transfert, il est plus efficace de copier un seul fichier.</div>
<div id="_mcePaste" style="text-align: justify;">Deuxièmement, sous Windows, il n&#8217;est pas possible de créer simplement un répertoire dont le nom commence par un point. En dézippant le Generic-Metadata.zip, plus de souci !</div>
<div id="_mcePaste" style="text-align: justify;">Il serait aussi envisageable d&#8217;utiliser un SCM pour ce répertoire .metadata. Cela aurait en plus l&#8217;avantage de pouvoir versionner.</div>
<h4 style="text-align: justify;">-un Eclipse associé</h4>
<div id="_mcePaste" style="text-align: justify;">Il est possible et même conseillé d&#8217;avoir à coté de ce Zip un Eclipse préconfiguré possédant tous les plugins utilisés sur le projet.</div>
<h4 style="text-align: justify;">- Maintien non optimal&#8230;</h4>
<div id="_mcePaste" style="text-align: justify;">Comme tout standard, cette pratique doit être vivante. Tout le monde peut/doit faire évoluer ce Zip.</div>
<div id="_mcePaste" style="text-align: justify;">Si une nouvelle configuration émerge (ex. pour un nouveau plugin utilisé) il faut tout de suite penser à mettre à jour ce Generic-Metadata.zip. Tous les nouveaux workspaces créés prendront en compte cette nouvelle configuration.</div>
<div id="_mcePaste" style="text-align: justify;">Mais attention.</div>
<div id="_mcePaste" style="text-align: justify;">Seulement les nouveaux workspaces créés auront ces dernières configurations.</div>
<div id="_mcePaste" style="text-align: justify;">De plus un workspace dans lequel on a déjà importé des projets ne peut plus servir à générer un Generic-Metadata.zip.</div>
<div id="_mcePaste" style="text-align: justify;">Prenons un exemple :</div>
<div id="_mcePaste" style="text-align: justify;">
<ul>
<li>le techlead a créé et partagé un GeneriqueMetadata-V0.zip</li>
<li>René s&#8217;en est servi pour créer son workspace et il y a importé ses projets</li>
<li>il a ensuite modifié sa configuration (ex. pour que la javadoc soit générée automatiquement, une meilleure disposition des vues, etc.)</li>
<li>René ne peut plus générer de GeneriqueMetadata.zip à partir de ce workspace car il a été &laquo;&nbsp;pollué&nbsp;&raquo; par des informations spécifiques au projet, à sa machine, etc.</li>
</ul>
</div>
<div id="_mcePaste" style="text-align: justify;">Pour partager sa configuration René doit :</div>
<div id="_mcePaste" style="text-align: justify;">
<ul>
<li>utiliser dans un workspace vide le GeneriqueMetadata-V0.zip (cf. Comment utiliser ce Zip ?)</li>
<li>faire ses modifications de configuration</li>
<li>rezipper en un GeneriqueMetadata-V1.zip et partager cette nouvelle version</li>
</ul>
</div>
<div id="_mcePaste" style="text-align: justify;">Si maintenant un autre membre du projet souhaite se mettre à jour et veut utiliser le GeneriqueMetadata-V1.zip, c&#8217;est lui qui va perdre sa configuration spécifique.</div>
<h4 style="text-align: justify;">Amélioration ?</h4>
<div id="_mcePaste" style="text-align: justify;">Un répertoire .metadata sur le SVN avec seulement la configuration non spécifique de commitée. Il me semble que cela deviendrait trop couteux. En effet, il faudrait alors analyser le contenu de ce répertoire. Si vous voulez tenter&#8230; Bonne chance et merci de partager vos retours !</div>
<h4 style="text-align: justify;">Pas convaincu ?</h4>
<div style="text-align: justify;">Je vous donne une piste à creuser si vous avez la chance d&#8217;être sous Helios. Le récent Maven Studio de Sonatype pour Eclipse Helios :</div>
<div id="_mcePaste" style="text-align: justify;">http://www.sonatype.com/books/m2eclipse-book/reference/mse-quickstart.html</div>
</div>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=18492" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/environnement-de-developpement-maveneclipse-pour-gwt-17/' rel='bookmark' title='Environnement de développement Maven/Eclipse pour GWT 1.7'>Environnement de développement Maven/Eclipse pour GWT 1.7</a></li>
<li><a href='http://blog.octo.com/25-minutes-pour-creer-un-plugin-text-editor-pour-eclipse/' rel='bookmark' title='60 minutes pour créer un plugin Text Editor pour Eclipse'>60 minutes pour créer un plugin Text Editor pour Eclipse</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/workspace-eclipse-standardise/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Industrialisation des développements : automatisez votre base de données</title>
		<link>http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=industrialisation-des-developpements-automatisez-votre-base-de-donnees</link>
		<comments>http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 13:18:26 +0000</pubDate>
		<dc:creator>Thomas Queste</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[amélioration continue]]></category>
		<category><![CDATA[Base de données]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[Industrialisation]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=14855</guid>
		<description><![CDATA[Le grand oubli dans l&#8217;industrialisation des développements est la base de données, cette chose monolithique et statique qui n&#8217;évolue pas aussi vite et aussi aisément que le code. Au même titre que l&#8217;intégration continue et les systèmes de gestion de version pour le code source, il existe des outils permettant de fluidifier et d&#8217;automatiser le [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/outiller-un-audit-de-base-de-donnees/' rel='bookmark' title='Outiller un audit de base de données'>Outiller un audit de base de données</a></li>
<li><a href='http://blog.octo.com/industrialisation-des-developpements-android/' rel='bookmark' title='Industrialisation des développements Android'>Industrialisation des développements Android</a></li>
<li><a href='http://blog.octo.com/une-base-de-donnees-purement-fonctionnelle-2/' rel='bookmark' title='Une base de données purement fonctionnelle'>Une base de données purement fonctionnelle</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Findustrialisation-des-developpements-automatisez-votre-base-de-donnees%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Industrialisation%20des%20d%C3%A9veloppements%20%3A%20automatisez%20votre%20base%20de%20donn%C3%A9es%22%20%7D);"></div>
<p>Le grand oubli dans l&#8217;industrialisation des développements est la base de données, cette chose monolithique et statique qui n&#8217;évolue pas aussi vite et aussi aisément que le code. Au même titre que l&#8217;intégration continue et les systèmes de gestion de version pour le code source, il existe des outils permettant de fluidifier et d&#8217;automatiser le travail autour du schéma physique des données. Travailler avec ces outils permet de compléter une démarche Agile en permettant une réactivité forte face aux changements.</p>
<p>Une première partie de cet article concernera les principes et pratiques autour de ces outils (partie « boss compliant »). La deuxième est orientée technique (partie « geek aware »).</p>
<p><span id="more-14855"></span></p>
<h2>Principes directeurs</h2>
<p>Dans son article paru en 2003 intitulé « <a href="http://martinfowler.com/articles/evodb.html">Evolutionary Database Design</a> », Martin Fowler pose les principes du design évolutif de base de données. Les points clés en sont :</p>
<ul>
<li>La base de données évolue en même temps que le code ;</li>
<li>Il faut donc tester en continu la base de données pour permettre un refactoring sans conséquence, comme on le fait avec le code source ;</li>
<li>Il faut outiller les processus autour de la base de données afin d&#8217;améliorer la productivité des développements et leur industrialisation.</li>
</ul>
<p>Les outils existants reposent sur les principes suivants :</p>
<ul>
<li>Un schéma doit pouvoir être détruit et recréé de manière répétable ;</li>
<li>La version du schéma doit être identifiable ;</li>
<li>La montée et la descente de version doivent être automatisées ;</li>
<li>Les changements appliqués doivent être connus ;</li>
<li>Un changement doit pouvoir être défait ou annulé ;</li>
<li>Un changement précédemment appliqué ne doit pas être modifié mais un nouveau changement doit être créé.</li>
</ul>
<h2>Principes techniques</h2>
<p>Sur le plan technique, le fonctionnement des outils de migration est simple. Ils se basent sur une table contenant la version de la base de données. La liste des scripts exécutés est conservée ainsi qu’une empreinte de chaque script afin de détecter une altération d’un script déjà exécuté.</p>
<p>A chaque lancement, l’outil de migration compare la version de la base et les scripts existants  et propose la mise à jour le cas échéant.</p>
<p>Il est également possible de « descendre de version » le schéma (fonctionnalité disponible dans quasiment tous les outils). Il s’agit de remettre la base de données dans un état cohérent. Deux cas d’usage :</p>
<ul>
<li>développement d’une nouvelle fonctionnalité : il est ainsi possible de créer un script et de l’exécuter plusieurs fois (montée de version, test, modification, descente, puis nouvelle montée de version). La descente de version permet ainsi de faire revenir la base de données dans l’état précédent ;</li>
<li>Ré-alignement automatique du schéma avec le code quand la version de la base de données n’est plus la bonne. Ce cas intervient quand il faut corriger un bug sur la version de production ou au passage à une autre branche de développement, ou encore quand un script a été exécuté puis modifié.</li>
</ul>
<p>Même si la descente de version est utile, elle a néanmoins deux inconvénients. Le premier est que les instructions de descente doivent être écrites à la main. Les outils les plus simples fonctionnent sur le principe où chaque script contient une partie montée de version et une partie descente (voir l’exemple plus bas avec MyBatis). Seul Liquibase est capable de générer les instructions de descente de version grâce à son DSL.</p>
<p>Le deuxième inconvénient est que certaines montées de version ne sont pas réversibles (suppression de table ou de données). Dans ce cas, la descente ne sera possible que jusqu&#8217;à la version incluant ce type de modification. L&#8217;alternative est de recréer le schéma de zéro, une fonctionnalité que tous les outils proposent et qui est en fin de compte très rapide.</p>
<h2>Bonnes pratiques</h2>
<p>Les bonnes pratiques poussées par ces outils sont :</p>
<ul>
<li>Scripts (SQL ou XML pour Liquibase) stockés avec le code source</li>
<li>Une base de données par développeur (réaliste quand la gestion de la DB est automatisée, hors problème de coût de licence) ;</li>
<li>Une base de données commune à l’équipe qui représente l’état complet et stable ;</li>
<li>L’intégration continue déroule l’ensemble des scripts à chaque livraison ;</li>
<li>Un script qui a déjà pu être exécuté ne doit plus être modifié. On risque sinon de désynchroniser les scripts et le schéma  La livraison d’un nouveau script est nécessaire dans ce cas. Ce script est un refactoring du précédent. La seule exception est un script buggé qui provoque la perte de la donnée. Il ne faut donc pas que ce script atteigne les autres environnements.</li>
</ul>
<h2>Les outils existants</h2>
<h3>Liquibase : puissant mais complexe</h3>
<p><a title="Site de Liquibase" href="http://liquibase.org/">Liquibase</a> est le plus connu des outils de migration de base de données. Il se base sur les patterns décrits dans le livre « Refactoring database ». À ce titre, il est conçu autour d’une approche théorique par pattern de refactoring.</p>
<p>Le noyau de Liquibase est son DSL basé sur XML qui a les avantages :</p>
<ul>
<li>d’être compatible avec plusieurs moteurs SQL ;</li>
<li>de donner une sémantique aux opérations (on écrira un &lt;renameColumn&gt; plutôt qu’un alter table) ;</li>
<li>de générer automatique des instructions de rollback (par exemple, un &lt;createColumn&gt; sera compensé par un &lt;dropColumn&gt;).</li>
</ul>
<p>Liquibase est complet. Il s’intègre à Maven, Grails, Spring et Hibernate et supporte la génération de documentation ou encore la création d’un diff entre schémas.</p>
<p>L’inconvénient principal de Liquibase est une certaine complexité qui ne se retrouve pas dans les autres outils (XML, notion de changelog et de changeset, versionning sur id/auteur/chemin). La courbe d&#8217;apprentissage est donc plus élevée que les autres outils se basant purement sur du SQL.</p>
<p>Exemple de changeSet Liquibase :</p>
<pre class="brush:xml">&lt;changeSet id="1" author="bob"&gt;
 &lt;createTable tableName="department"&gt;
  &lt;column name="id" type="int"&gt;
   &lt;constraints primaryKey="true" nullable="false"/&gt;
  &lt;/column&gt;
  &lt;column name="name" type="varchar(50)"/&gt;
 &lt;/createTable&gt;
&lt;/changeSet&gt;</pre>
<h3>Les pragmatiques</h3>
<p>D’autres outils ne vont pas aussi loin que Liquibase en termes de fonctionnalités et d&#8217;abstraction mais leur approche est pragmatique et plus simple. Ils visent avant tout à automatiser la gestion des scripts SQL. Les principaux sont <a title="Site de Mybatis" href="http://www.mybatis.org/java.html">MyBatis Schema Migration</a>, <a title="Site de DBMaintain" href="http://dbmaintain.sourceforge.net/">DbMaintain</a> et <a title="Site de C5 DB Migration" href="http://code.google.com/p/c5-db-migration/">C5 DB Migration</a>.</p>
<p>Le principe de ces outils est assez simple et consiste à lancer une série de scripts stockés dans une arborescence répartie en version. Les actions sont tracées ce qui permet de connaître l’état du schéma.</p>
<p>Exemple d’arborescence organisée pour DbMaintain :</p>
<pre>scripts/01_v1.0/01_products_and_orders.sql
                02_users.sql
        02_v1.1/01_add_barcode_column.sql
                02_drop_itemcode_column.sql</pre>
<p>Le schéma de base de données est mis à jour en exécutant :</p>
<pre>dbmaintain.sh update chemin/vers/les/scripts
</pre>
<p>Dans le cas de MyBatis, les instructions de montée et de descente de version sont écrites dans le même script SQL. Exemple :</p>
<pre>--// create product table
CREATE TABLE PRODUCT (ID INT, NAME VARCHAR(255));

--//@UNDO
DROP TABLE PRODUCT;
</pre>
<h2>Conclusion</h2>
<p>Les outils de migration de base de données permettent une meilleure productivité en levant certaines barrières au changement du schéma des données et ils rendent l&#8217;industrialisation accessible.</p>
<p>Les points clés à retenir sont :</p>
<ul>
<li>Les outils de migration de bases de données nous permettent de gagner en efficacité lors de la manipulation du schéma de la base de données ;</li>
<li>Ces outils fiabilisent les traitements en les automatisant et en les intégrants à l’usine de développement ;</li>
<li>Ces outils apportent de bonnes pratiques permettant un travail en équipe plus efficace ;</li>
<li>Ces outils sont disponibles, simples à mettre en place et OpenSource.</li>
</ul>
<p>Par extension, on peut imaginer qu&#8217;une application puisse se mettre à jour d&#8217;elle-même. En effet, il s’agirait de permettre à l’application de lancer les migrations de schémas quand elle démarre. Cette fonctionnalité réduit le temps de mise en production en supprimant l’étape de passage des scripts par les DBA. Liquibase propose déjà cette fonctionnalité.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=14855" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/outiller-un-audit-de-base-de-donnees/' rel='bookmark' title='Outiller un audit de base de données'>Outiller un audit de base de données</a></li>
<li><a href='http://blog.octo.com/industrialisation-des-developpements-android/' rel='bookmark' title='Industrialisation des développements Android'>Industrialisation des développements Android</a></li>
<li><a href='http://blog.octo.com/une-base-de-donnees-purement-fonctionnelle-2/' rel='bookmark' title='Une base de données purement fonctionnelle'>Une base de données purement fonctionnelle</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/industrialisation-des-developpements-automatisez-votre-base-de-donnees/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>AOP et Swing : un duo élégant</title>
		<link>http://blog.octo.com/aop-et-swing-un-duo-elegant/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aop-et-swing-un-duo-elegant</link>
		<comments>http://blog.octo.com/aop-et-swing-un-duo-elegant/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 10:00:50 +0000</pubDate>
		<dc:creator>Olivier Mallassi</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=10118</guid>
		<description><![CDATA[Ce n&#8217;est pas la nouveauté de l&#8217;année mais Swing, bien que présent en entreprise, n&#8217;évolue que très peu. Le kit de développement offre nativement toujours aussi peu de composants évolués (tableaux triables&#8230;) même s&#8217;il faut avouer que certaines librairies commerciales compensent à merveille ces manques. Les APIs et le développement Swing est toujours aussi verbeux [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/testabilites-des-ihm-commencons-deja-par-swing/' rel='bookmark' title='Testabilité des IHM : commençons (déjà) par Swing!'>Testabilité des IHM : commençons (déjà) par Swing!</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Faop-et-swing-un-duo-elegant%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22AOP%20et%20Swing%20%3A%20un%20duo%20%C3%A9l%C3%A9gant%22%20%7D);"></div>
<p><strong>Ce n&#8217;est pas la nouveauté de l&#8217;année mais Swing</strong>, bien que présent en entreprise, <strong>n&#8217;évolue que très peu</strong>. Le kit de développement offre nativement toujours aussi peu de composants évolués (tableaux triables&#8230;) même s&#8217;il faut avouer que certaines librairies commerciales compensent à merveille ces manques. Les APIs et le développement Swing est toujours aussi verbeux et finalement assez peu productif (de mon humble avis). <strong>Et ce n&#8217;est malheureusement pas les quelques JSR en stand by qui vont y changer quoique ce soit</strong> : <a href="http://jcp.org/en/jsr/detail?id=295">Beans Binding</a> est au statut inactif, Beans Validation, drafté en 2008 n&#8217;est toujours pas inclus dans le JDK (peut-être pour la version 7 ?) et la JSR 296 (qui définit au travers de 4 callback le cycle de vie standard d&#8217;une application) ne représente pas non plus la plus importante des améliorations qu&#8217;ait connu un framework (si si je vous jure j&#8217;aime Swing&#8230;)</p>
<p>Alors il est nécessaire de compenser ces manques&#8230;<br />
<span id="more-10118"></span><br />
A côté de cela, je suis un fan d&#8217;AOP depuis les premières versions <a href="http://eclipse.org/aspectj/">d&#8217;AspectJ</a>. Je trouve ce paradigme de développement d&#8217;une rare élégance et il est aujourd&#8217;hui suffisamment outillé (intégration aux IDEs, intégration à Maven&#8230;) pour pouvoir parsemer quelques aspects de ci de là.</p>
<p>Voilà donc quelques problématiques Swing récurrentes qu&#8217;il est possible d&#8217;outiller avec AOP.</p>
<h2>Injection de services</h2>
<p>L&#8217;objectif est simple : <strong>reproduire l&#8217;IOC au niveau de l&#8217;IHM et notamment dans les actions </strong>(en fait les <code>ActionListener</code> branchés sur les boutons). Dès lors on souhaite injecter une implémentation du service (définie par exemple comme un bean Spring) sur toute propriété qui aurait l&#8217;annotation custom <code>@Inject</code>.</p>
<p>Par exemple, injecter le service <code>myService</code> dans l&#8217;action suivante (on peut faire mieux mais dans cet exemple, le bean est injecté sur la base du nom et non du type)  :</p>

<div class="wp_codebox"><table><tr id="p101188"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p10118code8"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MyActionListener <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">ActionListener</span><span style="color: #009900;">&#123;</span>
	@Inject
	<span style="color: #000000; font-weight: bold;">private</span> MyService myService
&nbsp;
	...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>L&#8217;aspect suivant permet l&#8217;injection du Bean Spring nommé <code>myService </code></p>

<div class="wp_codebox"><table><tr id="p101189"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code" id="p10118code9"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> aspect SpringInjectAspect <span style="color: #009900;">&#123;</span>
    pointcut fieldsInjection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> within<span style="color: #009900;">&#40;</span>com.<span style="color: #006633;">mypackage</span>..<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>
	    execution<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> java.<span style="color: #006633;">awt</span>.<span style="color: #006633;">event</span>.<span style="color: #003399;">ActionListener</span><span style="color: #339933;">+</span>.<span style="color: #006633;">actionPerformed</span><span style="color: #009900;">&#40;</span>..<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    before<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> fieldsInjection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">Class</span> currentClass <span style="color: #339933;">=</span> thisJoinPoint.<span style="color: #006633;">getThis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">Object</span> currentObject <span style="color: #339933;">=</span> thisJoinPoint.<span style="color: #006633;">getThis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//to inject bean spring even in super class property</span>
        <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>currentClass.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">ActionListener</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
             injectBean<span style="color: #009900;">&#40;</span>currentClass, currentObject<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
             <span style="color: #666666; font-style: italic;">//for te next step</span>
             currentClass <span style="color: #339933;">=</span> currentClass.<span style="color: #006633;">getSuperclass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> injectBean<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">Class</span> currentClass, <span style="color: #003399;">Object</span> currentObject<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Field</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> fields <span style="color: #339933;">=</span> currentClass.<span style="color: #006633;">getDeclaredFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> fields.<span style="color: #006633;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">Annotation</span> associatedAnnotation <span style="color: #339933;">=</span> fields<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">getAnnotation</span><span style="color: #009900;">&#40;</span>Inject.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>associatedAnnotation <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">//get the bean by the field name</span>
                    <span style="color: #003399;">Object</span> implementationObject <span style="color: #339933;">=</span> SpringHelper.<span style="color: #006633;">getApplicationContext</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getBean</span><span style="color: #009900;">&#40;</span>
                            fields<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
                        fields<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">setAccessible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        fields<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>currentObject, implementationObject<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                    <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IllegalArgumentException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                       ... <span style="color: #000000; font-weight: bold;">do</span> what you need to <span style="color: #000000; font-weight: bold;">do</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>NoSuchBeanDefinitionException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">//log the fact the asked bean do not exist</span>
                    <span style="color: #000000; font-weight: bold;">throw</span> e<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Outillage du Binding (notamment dans le cadre d&#8217;une utilisation avec jGoodies)</h2>
<p>L&#8217;utilisation d&#8217;un mécanisme de binding type jGoodies peut-être intéressant <strong>mais quoiqu&#8217;il en soit, il passe souvent par l&#8217;écriture de code supplémentaire </strong>notamment dans les setter :</p>

<div class="wp_codebox"><table><tr id="p1011810"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p10118code10"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setBooleanValue<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> newValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">boolean</span> oldValue <span style="color: #339933;">=</span> booleanValue<span style="color: #339933;">;</span>
  booleanValue <span style="color: #339933;">=</span> newValue<span style="color: #339933;">;</span>
  changeSupport.<span style="color: #006633;">firePropertyChange</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;booleanValue&quot;</span>, oldValue, newValue<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Dans cet exemple, il est nécessaire de rajouter dans chaque setter, l&#8217;appel à la méthode <code>fireProperyChange </code>en précisant nouvelle et ancienne valeur et surtout le nom de la propriété (ce qui bien entendu sera source d&#8217;erreur puisque ce code sera copié-collé de setter en setter&#8230;).</p>
<p>Là encore <strong>AOP nous aide en permettant d&#8217;enrichir un setter &laquo;&nbsp;classique&nbsp;&raquo;</strong> (i.e. qui ne fait que mettre à jour la propriété). Ainsi le setter se définit classiquement :</p>

<div class="wp_codebox"><table><tr id="p1011811"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p10118code11"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setBooleanValue<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> newValue<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  booleanValue <span style="color: #339933;">=</span> newValue<span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>et l&#8217;aspect suivant se charge du reste :</p>

<div class="wp_codebox"><table><tr id="p1011812"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p10118code12"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> aspect jGoodiesBindingAspect <span style="color: #009900;">&#123;</span>
    pointcut propertyEnhancement<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> within<span style="color: #009900;">&#40;</span>com.<span style="color: #006633;">mypackage</span>..<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> execution <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> com.<span style="color: #006633;">jgoodies</span>.<span style="color: #006633;">binding</span>.<span style="color: #006633;">beans</span>.<span style="color: #006633;">Model</span><span style="color: #339933;">+</span>.<span style="color: #006633;">set</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>..<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">void</span> around<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> propertyEnhancement<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Object</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args <span style="color: #339933;">=</span> thisJoinPoint.<span style="color: #006633;">getArgs</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> propertyName <span style="color: #339933;">=</span> thisJoinPoint.<span style="color: #006633;">getSignature</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">Object</span> oldValue <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003399;">Method</span> propertyGetter <span style="color: #339933;">=</span> thisJoinPoint.<span style="color: #006633;">getThis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
                    .<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;get&quot;</span> <span style="color: #339933;">+</span> propertyName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            oldValue <span style="color: #339933;">=</span> propertyGetter.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>thisJoinPoint.<span style="color: #006633;">getThis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003399;">Object</span> newValue <span style="color: #339933;">=</span> args<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
            proceed<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// if no error occurs</span>
            <span style="color: #003399;">Method</span> firePropertyChangeMethod <span style="color: #339933;">=</span> com.<span style="color: #006633;">jgoodies</span>.<span style="color: #006633;">binding</span>.<span style="color: #006633;">beans</span>.<span style="color: #006633;">Model</span>.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getDeclaredMethod</span><span style="color: #009900;">&#40;</span>
                    <span style="color: #0000ff;">&quot;firePropertyChange&quot;</span>, <span style="color: #003399;">String</span>.<span style="color: #000000; font-weight: bold;">class</span>, <span style="color: #003399;">Object</span>.<span style="color: #000000; font-weight: bold;">class</span>, <span style="color: #003399;">Object</span>.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            firePropertyChangeMethod.<span style="color: #006633;">setAccessible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            propertyName <span style="color: #339933;">=</span> org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">commons</span>.<span style="color: #006633;">lang</span>.<span style="color: #006633;">StringUtils</span>.<span style="color: #006633;">uncapitalize</span><span style="color: #009900;">&#40;</span>propertyName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            firePropertyChangeMethod.<span style="color: #006633;">invoke</span><span style="color: #009900;">&#40;</span>thisJoinPoint.<span style="color: #006633;">getThis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, propertyName, oldValue, newValue<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">NoSuchMethodException</span>
			...<span style="color: #000000; font-weight: bold;">do</span> what you need to <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Dans ce cas, le pointcut est défini sur toutes les méthodes qui commencent par <code>set </code>de n&#8217;importe quelle classe héritant de <code>com.jgoodies....Model</code>.</p>
<h2>Habilitation sur la fonction et la donnée au niveau de l&#8217;IHM</h2>
<p>Il s&#8217;agit là encore d&#8217;une problématique hyper classique : <strong>comment rendre &laquo;&nbsp;inaccessible&nbsp;&raquo;</strong> (comprendre non modifiable, non utilisable) <strong>des fonctions</strong> (des boutons, des menus&#8230;) <strong>d&#8217;une IHM Swing</strong>. On parle donc ici de &laquo;&nbsp;griser&nbsp;&raquo; (ie. <code>myComponent.setEnabled(...)</code>) les composants graphiques soumis à une habilitation.</p>
<p>La première étape consiste à définir une annotation permettant de définir les rôles sur un <code>JComponent</code>. Rien de génial là dedans. Il est possible de l&#8217;utiliser ainsi et de définir que <code>myComboBox </code>est accessible pour les utilisateurs ayant les rôles &laquo;&nbsp;consultation-level-1&#8243; et &laquo;&nbsp;consultation-level-2&#8243;</p>

<div class="wp_codebox"><table><tr id="p1011813"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p10118code13"><pre class="java" style="font-family:monospace;">@Authorize<span style="color: #009900;">&#40;</span>roles<span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&quot;consultation-level-1, consultation-level-2&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">JComponent</span> myComboBox<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>L&#8217;aspect suivant prend en charge le &laquo;&nbsp;grisage/dégrisage&nbsp;&raquo; des widgets graphiques suivant le rôle</p>

<div class="wp_codebox"><table><tr id="p1011814"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p10118code14"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> aspect AuthorizationAspect <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> pointcut authorized_gui<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span>  within<span style="color: #009900;">&#40;</span>com.<span style="color: #006633;">mypackage</span>..<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> set<span style="color: #009900;">&#40;</span>@Authorize <span style="color: #339933;">*</span> <span style="color: #339933;">*</span>..<span style="color: #339933;">*</span>.<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    after<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> authorized_gui<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">String</span> pointCutKind <span style="color: #339933;">=</span> thisJoinPoint.<span style="color: #006633;">getKind</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>JoinPoint.<span style="color: #006633;">FIELD_SET</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>pointCutKind<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            java.<span style="color: #006633;">lang</span>.<span style="color: #006633;">reflect</span>.<span style="color: #003399;">Field</span> field <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>FieldSignature<span style="color: #009900;">&#41;</span> thisJoinPoint.<span style="color: #006633;">getSignature</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getField</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
                field.<span style="color: #006633;">setAccessible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #003399;">Object</span> theField <span style="color: #339933;">=</span> field.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>thisJoinPoint.<span style="color: #006633;">getThis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>theField <span style="color: #000000; font-weight: bold;">instanceof</span> <span style="color: #003399;">JComponent</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    Authorize authorization <span style="color: #339933;">=</span> field.<span style="color: #006633;">getAnnotation</span><span style="color: #009900;">&#40;</span>Authorize.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> roles <span style="color: #339933;">=</span> authorization.<span style="color: #006633;">roles</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #666666; font-style: italic;">//ask your security context holder the role the user have</span>
                    <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">JComponent</span><span style="color: #009900;">&#41;</span> theField<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span>SecurityContextHolder.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
                            .<span style="color: #006633;">isUserInRole</span><span style="color: #009900;">&#40;</span>roles<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IllegalAccessException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> TechnicalException<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>La subtilité dans cet aspect réside dans le <code>set(@Authorize * *..*.*)</code> qui permet d&#8217;attraper l&#8217;instanciation (et non pas l&#8217;appel au constructeur) de toutes les propriétés qui ont l&#8217;annotation spécifiée.</p>
<p><strong>Voilà donc quelques problématiques qu&#8217;il est possible de régler de façon assez simple, élégante et peu intrusive sur le code grâce à AOP</strong>. D&#8217;autres utilisations existent. La plus courante est certainement de gérer de façon automatique toutes les exceptions non typées &#8211; qui dans le cas d&#8217;une IHM donne typiquement lieu à l&#8217;affichage (dans une popup ou non) d&#8217;un message du type &laquo;&nbsp;une erreur a eu lieu, veuillez contacter votre administrateur&nbsp;&raquo;. D&#8217;autres utilisations encore peu répandues visent à valider certaines règles de codage propre à votre projet (via l&#8217;utilisation de <code>declare warning</code> et <code>declare error</code>).</p>
<p>Et vous, voyez vous d&#8217;autres problématiques qu&#8217;il serait intéressant de gérer de la sorte?</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=10118" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/testabilites-des-ihm-commencons-deja-par-swing/' rel='bookmark' title='Testabilité des IHM : commençons (déjà) par Swing!'>Testabilité des IHM : commençons (déjà) par Swing!</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/aop-et-swing-un-duo-elegant/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Présentation industrialisation Java au salon Solutions Linux [MAJ 17/03]</title>
		<link>http://blog.octo.com/presentation-industrialisation-java-au-salon-solutions-linux/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=presentation-industrialisation-java-au-salon-solutions-linux</link>
		<comments>http://blog.octo.com/presentation-industrialisation-java-au-salon-solutions-linux/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 17:00:42 +0000</pubDate>
		<dc:creator>Christian Blavier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=10060</guid>
		<description><![CDATA[[MAJ 17/03] Les slides de la session sont désormais disponibles à la fin de cet article. Nous serons présent le 17 mars 2010 au salon Solutions Linux. J&#8217;aurai le plaisir d&#8217;y co-animer une session avec Benoît Lafontaine sur l&#8217;industrialisation des développements Java. Qu&#8217;entendons nous par industrialisation ? Principalement 3 activités : l&#8217;intégration continue. Nous commencerons [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/mon-salon-linux-12/' rel='bookmark' title='Mon salon &#8230; linux (1/2)'>Mon salon &#8230; linux (1/2)</a></li>
<li><a href='http://blog.octo.com/mon-salon-linux-22/' rel='bookmark' title='Mon salon &#8230; linux (2/2)'>Mon salon &#8230; linux (2/2)</a></li>
<li><a href='http://blog.octo.com/performances-de-build-java-sous-linux/' rel='bookmark' title='Performances de build Java sous Linux ?'>Performances de build Java sous Linux ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fpresentation-industrialisation-java-au-salon-solutions-linux%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Pr%C3%A9sentation%20industrialisation%20Java%20au%20salon%20Solutions%20Linux%20%5BMAJ%2017%2F03%5D%22%20%7D);"></div>
<p><a href="http://blog.octo.com/wp-content/uploads/2010/03/solutions-linux1.gif"><img class="size-full wp-image-10067 alignright" title="solutions-linux" src="http://blog.octo.com/wp-content/uploads/2010/03/solutions-linux1.gif" alt="" width="140" height="109" /></a></p>
<p>[MAJ 17/03] Les slides de la session sont désormais disponibles à la fin de cet article.</p>
<p>Nous serons présent le 17 mars 2010 au salon Solutions Linux. J&#8217;aurai le plaisir d&#8217;y co-animer une session avec Benoît Lafontaine sur l&#8217;industrialisation des développements Java.</p>
<p>Qu&#8217;entendons nous par industrialisation ? Principalement 3 activités :</p>
<ul>
<li><strong>l&#8217;intégration continue</strong>. Nous commencerons par à un retour sur l&#8217;état de l&#8217;art de cette pratique agile aujourd&#8217;hui largement démocratisée, puis nous verrons comment faire face aux nouveaux défis rencontrés : réduction du temps de build, constructions d&#8217;applications profilées par environnement, build distribué ou encore build incassable.</li>
<li><strong>le développement piloté par les test</strong>s. Depuis 4 ans, les outils de tests fonctionnels automatisés comme FitNesse s&#8217;efforcent de remettre le besoin et les maitrises d&#8217;ouvrage au coeur du développement logiciel. Nous ferons le bilan sur ces outils et balayerons les perspectives offertes par de nouvelles approches et de nouveaux types d&#8217;outils (BDD).</li>
<li><strong>mesure continue de la qualité</strong>. Nous verrons comment utiliser la mesure de la qualité comme une dynamique d&#8217;amélioration continue et comment en éviter les dérives comme le &laquo;&nbsp;flicage&nbsp;&raquo;.</li>
</ul>
<p><span id="more-10060"></span></p>
<p>Voici les slides que nous avons présenté : <a href="http://www.slideshare.net/cblavier/industrialisation-java-v10" target="_blank">http://www.slideshare.net/cblavier/industrialisation-java-v10</a></p>
<p style="text-align: center;"><iframe src="http://www.slideshare.net/slideshow/embed_code/3458237" width="450" height="375" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=10060" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/mon-salon-linux-12/' rel='bookmark' title='Mon salon &#8230; linux (1/2)'>Mon salon &#8230; linux (1/2)</a></li>
<li><a href='http://blog.octo.com/mon-salon-linux-22/' rel='bookmark' title='Mon salon &#8230; linux (2/2)'>Mon salon &#8230; linux (2/2)</a></li>
<li><a href='http://blog.octo.com/performances-de-build-java-sous-linux/' rel='bookmark' title='Performances de build Java sous Linux ?'>Performances de build Java sous Linux ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/presentation-industrialisation-java-au-salon-solutions-linux/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Monter une Usine De Développement iPhone</title>
		<link>http://blog.octo.com/monter-une-usine-de-developpement-iphone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=monter-une-usine-de-developpement-iphone</link>
		<comments>http://blog.octo.com/monter-une-usine-de-developpement-iphone/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 07:13:16 +0000</pubDate>
		<dc:creator>Vincent Daubry</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[Industrialisation]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[Mobilité]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[UDD]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=9291</guid>
		<description><![CDATA[Octo a récemment participé à la réalisation de l’application iNomineo pour iPhone (cf  OCTO Technology accompagne Generali sur l’iPhone ) : Pourquoi avons nous mis en place une usine de développement (UDD) suite à ce projet ? A première vue, cela soulève plusieurs questions : La mise en place d&#8217;une UDD relève d’une problématique d&#8217;industrialisation [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/tour-dhorizon-du-developpement-iphone/' rel='bookmark' title='Tour d&#8217;horizon du développement iPhone'>Tour d&#8217;horizon du développement iPhone</a></li>
<li><a href='http://blog.octo.com/choisir-son-ampli-et-son-usine-de-developpement/' rel='bookmark' title='Choisir son ampli (et son usine de développement)…'>Choisir son ampli (et son usine de développement)…</a></li>
<li><a href='http://blog.octo.com/petit-dej-iphone-as-a-business-platform/' rel='bookmark' title='Petit dej&#8217; : &laquo;&nbsp;iPhone as a business platform&nbsp;&raquo;'>Petit dej&#8217; : &laquo;&nbsp;iPhone as a business platform&nbsp;&raquo;</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fmonter-une-usine-de-developpement-iphone%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Monter%20une%20Usine%20De%20D%C3%A9veloppement%20iPhone%22%20%7D);"></div>
<p>Octo a récemment participé à la réalisation de l’application iNomineo pour iPhone (cf  <a href="http://blog.octo.com/octo-technology-accompagne-generali-sur-liphone/">OCTO Technology accompagne Generali sur l’iPhone</a> ) :</p>
<p><a href="http://itunes.apple.com/fr/app/inomineo/id338539804?mt=8"><img class="alignnone size-full wp-image-9337" title="logo" src="http://blog.octo.com/wp-content/uploads/2010/02/logo.png" alt="" width="100" height="100" /></a></p>
<p>Pourquoi avons nous mis en place une usine de développement (UDD) suite à ce projet ? A première vue, cela soulève plusieurs questions :</p>
<ul>
<li>La mise en place d&#8217;une UDD relève d’une problématique d&#8217;<strong>industrialisation</strong> : comment rendre plus 	productif un process que l&#8217;on maîtrise. Alors qu’un projet iPhone 	évoque plutôt l’innovation : un langage peu connu, de nouveaux 	outils, une nouvelle plateforme.</li>
</ul>
<ul>
<li>Une UDD a pour vocation de 	<strong>simplifier</strong> le travail d&#8217;<strong>intégration</strong> entre les différents 	développeurs : plus ceux-ci sont nombreux, plus l&#8217;UDD se révèle 	payante. Or nous n&#8217;étions que 3 développeurs sur ce projet, on 	aurait tendance à penser que l&#8217;on peut gérer cet effort 	d&#8217;intégration « à la main ».</li>
</ul>
<ul>
<li>L&#8217;UDD a également pour rôle 	d&#8217;<strong>automatiser</strong> l&#8217;exécution des tests, or une des particularités 	d&#8217;une application iPhone c&#8217;est la prédominance de l&#8217;interface 	graphique (réputée couteuse et compliquée à tester), de plus 	quels outils peut-on utiliser ?</li>
</ul>
<ul>
<li>Pour finir, l&#8217;iPhone souffre encore 	de l&#8217;image du jeune étudiant faisant fortune sur l&#8217;appstore : ce 	type de projet véhicule pour certains une image d&#8217;amateurisme, 	« c&#8217;est un travail à confier à un stagiaire ».</li>
</ul>
<p>Pourtant l’expérience nous a montré qu&#8217;une UDD et la pratique des tests unitaires apportent des solutions à des problèmes récurrents sur le projet.</p>
<p>De plus, la mise en place d&#8217;une UDD avec une couverture de test conséquente et les métriques associées sont un moyen d&#8217;apporter un gage de qualité et de professionnalisme à un projet iPhone.</p>
<p>Dans cet article, nous couvrirons les raisons concrètes qui nous ont poussé à le faire, et comment nous y sommes parvenus.</p>
<p>Dans un prochain article, nous verrons quelles pratiques de test mettre en place sur un projet iPhone (les outils, les méthodes, les bonnes pratiques).</p>
<p><span id="more-9291"></span></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --><span style="font-size: medium;"><span style="font-size: small;"><strong>Pourquoi a-t-on mis en place l’UDD sur notre projet</strong></span> </span></p>
<p>Ce projet a été l’occasion pour moi de m’initier au développement iPhone. Au démarrage <strong>le ticket d’entrée paraît très élevé</strong> : il faut découvrir une nouvelle plateforme (un téléphone mobile), un nouvel environnement (Mac quand on vient de PC), un nouveau langage (Objective-C), de nouveaux outils (Xcode, interface builder, instruments), les frameworks Cocoa (UIKit, CoreGraphics, CoreAnimation, etc).</p>
<p>Les questions d’industrialisation auxquelles on est habitué lorsque l’on vient du monde Java paraissent bien lointaines.</p>
<p>Mais une des particularités d’un projet iPhone, c’est que <strong>ces difficultés techniques sont mitigées par la qualité de l&#8217;environnement de développement :</strong> les outils et les frameworks bénéficient de plus de 20 ans de développements par Apple et NeXT et sont donc très matures. L&#8217;architecture des applications iPhone s&#8217;appuie largement sur des design patterns éprouvés.</p>
<p>L&#8217;objective-C, dont la syntaxe peut rebuter au premier abord, se révèle être un langage objet très structuré et agréable à manipuler.</p>
<p>Néanmoins, nous nous sommes vite aperçus que <strong>les problèmes propres au développement informatique en équipe sont toujours présents.</strong></p>
<p>Il s’agit de problèmes :</p>
<ul>
<li>d’<strong>organisation du travail en 	équipe</strong> : douleurs d’intégration des sources entre les 	différents développeurs</li>
<li>de <strong>qualité du code</strong> : 	douleurs lors de la recette et du refactoring</li>
<li>et d’<strong>environnements</strong> : 	douleurs de gestion des différentes versions sur chaque poste de 	développement lors du déploiement sur un iPhone</li>
</ul>
<p>Arrivé à ce stade, <strong>le risque est d’accepter la douleur </strong>: en effet, on a appris à vivre avec ces contraintes pendant les premiers temps du projet, et on hésite à investir dans ce que l’on ne ressent plus comme un frein.</p>
<p>A cela se rajoute le fait qu’à court terme, on a tendance à vouloir faire avancer le projet (bien plus palpitant surtout sur une plateforme « fun ») qu’industrialiser le développement (pas toujours  très excitant comme perspective au premier abord).</p>
<p>Nous avons donc travaillé à mettre en place une usine de développement qui vise à adresser les problèmes mentionnés ci-dessus.</p>
<p>Nous allons aborder dans cet article une série de cas concrets, les problèmes qui en découlent, et comment les résoudre grâce à la mise en place d’une usine de développement.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2010/02/capture-acceuil-udd-mini.png"><img class="size-full wp-image-9390 aligncenter" title="capture acceuil udd mini" src="http://blog.octo.com/wp-content/uploads/2010/02/capture-acceuil-udd-mini.png" alt="" width="315" height="184" /></a></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --><span style="font-size: medium;"><strong>I) Rationaliser le déploiement : </strong></span><strong>Une version stable à la demande</strong></p>
<p><em>Mise en situation :</em></p>
<p>Chaque développeur travaille sur le trunk du gestionnaire de source : à un instant t personne n’a de version stable sur son poste. De plus, il n&#8217;existe pas de version de référence de l&#8217;application. Ceci entraine 2 situations assez inconfortables :</p>
<ul>
<li>Lorsque le chef de projet ou un 	manager souhaite voir l&#8217;avancement des développements, le même 	scénario se répète : on commit tous « en vitesse » et 	comme on peut, on intègre à coup de commentaires dans le code et on 	déploie une version de démo plus ou moins stable sur son iPhone 	(« tout marche sauf cet écran qui marchait hier, mais là on 	bosse dessus »). Ou pire, on lui demande de repasser le 	lendemain pour nous laisser le temps de figer une version stable.</li>
</ul>
<ul>
<li>Lors de la phase de recette, en 	fonction du poste à partir duquel on déploie, les bugs ne sont 	parfois pas les mêmes !</li>
</ul>
<p><em>Douleur :</em></p>
<p>Incapacité à fournir rapidement une version stable de l’application.</p>
<p><em>Cause :</em></p>
<p>L’omni-environnement : chaque poste de développeur est à la fois l’environnement de développement, d’intégration et de recette.</p>
<p><em>Solution :</em></p>
<p><strong>Automatiser la constitution d’une version</strong> issue directement du gestionnaire de sources. Cette version ne sera pas compilée en configuration Debug, mais en configuration Release, ce qui permettra de se rapprocher d’une situation de livraison.</p>
<p>La mise en place d’une usine de développement permet la distinction entre l’environnement de développement (le mac de chaque développeur), l’environnement d’intégration (un mac sur lequel tourne l’UDD) et l’environnement de recette (le poste mac ou PC, sur lequel on dépose l’application qui est transférée dans iTunes).</p>
<p><strong>Pré-requis :</strong></p>
<ul>
<li>Un projet Xcode sur un repository 	SVN 	(<span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://iphonedevelopment.blogspot.com/2009/03/version-control-is-your-friend.html">http://iphonedevelopment.blogspot.com/2009/03/version-control-is-your-friend.html</a></span></span>)</li>
</ul>
<ul>
<li>Un projet configuré pour pouvoir 	être déployé sur un iPhone 	(<span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://mobiforge.com/developing/story/deploying-iphone-apps-real-devices">http://mobiforge.com/developing/story/deploying-iphone-apps-real-devices</a></span></span>)</li>
</ul>
<ul>
<li>Mise en place de Hudson 	(<span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson">http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson</a></span></span>)</li>
</ul>
<p><strong>Configuration de l’UDD :</strong></p>
<p>Hudson ne prend pas en charge les projets Xcode par défaut. On va donc créer un script shell qui se chargera :</p>
<ul>
<li>de compiler le projet</li>
<li>d’historiser un zip de 	l’application dans un répertoire build-history</li>
<li>de déposer l’application 	compilée (.app) sur le bureau.</li>
</ul>
<p>Pour cela, il faut créer un job de type « free style » dans Hudson et ajouter au build une étape « Exécuter un script shell »</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2010/02/capture-conf-build.png"><img class="alignnone size-full wp-image-9340" title="capture conf build" src="http://blog.octo.com/wp-content/uploads/2010/02/capture-conf-build.png" alt="" width="339" height="134" /></a></p>
<p>Le SDK iPhone met à disposition une commande « xcodebuild » qui permet de lancer un build via ligne de commande.</p>
<p>Cette commande prend en paramètre le nom de la target à builder, la configuration à utiliser et le sdk pour lequel on build.</p>
<p>On utilisera la target par défaut en configuration « release » avec pour cible un device iphone 3.0</p>
<pre class="brush:java">xcodebuild -target  “maTarget” -configuration "Release" -sdk iphoneos3.0</pre>
<p>P.S : Assurez-vous :</p>
<p>- que le fichier build.sh a les droits nécessaires pour être exécuté (chmod 755 build.sh)</p>
<p>- d’ignorer le répertoire « build » du projet lors des commit: &#8216;svn propset svn:ignore build .&#8217;</p>
<p><strong>Axes d&#8217;améliorations :</strong></p>
<ul>
<li>En plus de déposer l&#8217;application sur le bureau, on pourrait automatiser l&#8217;installation de la nouvelle version dans iTunes.</li>
</ul>
<ul>
<li>Il semble possible de se baser sur le versionnement du bundle de l&#8217;application, pour que iTunes distingue des versions « snapshot » (qui ne seront pas mis à jour automatiquement sur l&#8217;iPhone) et des versions « release » (qui viendront remplacer automatiquement la dernière version).</li>
</ul>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --><span style="font-size: medium;"><strong>II) Qualité du code :</strong></span></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } --></p>
<p><span style="font-size: small;"><strong>Erreur 	de compilation :</strong></span></p>
<p><em>Mise en situation :</em></p>
<p>Un développeur oublie de commiter un fichier ou une ressource nécessaire au build. Ou pire, on commit un fichier qui ne compile pas. Les autres développeurs qui se synchronisent avec le gestionnaire de sources ne peuvent plus compiler et sont bloqués. Plus cette situation est détectée tôt, plus elle est facile à corriger.</p>
<p><em>Douleur :</em></p>
<p>Le coût des erreurs</p>
<p><em>Cause : </em></p>
<p>Erreur de commit</p>
<p><em>Solution :</em></p>
<p>L’UDD permet de signaler les erreurs de compilation. Nous allons faire évoluer le script afin de réaliser cette tâche et envoyer un mail aux développeurs lorsqu’un bug est détecté. <strong> </strong></p>
<p><strong>Détecter les erreurs de compilation :</strong></p>
<p>On va d’abord parser le résultat de la compilation afin de vérifier si celle-ci s’est bien déroulée. On va se baser sur le message &#8216;BUILD SUCCEEDED&#8217; qui apparait à la fin d’une compilation réussie.</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<pre class="brush:java">xcodebuild -target "${TARGET_NAME}" -configuration Release -sdk iphoneos3.0 &gt; /tmp/buildlogIphone.log

LOGRESULT=`grep 'BUILD SUCCEEDED' /tmp/buildlogIphone.log`
if [ "$LOGRESULT" == "" ]
then
exit 1
fi</pre>
<p>Lorsque la compilation échoue, Hudson enverra automatiquement un mail aux destinataires configurés ( <span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson">http://wiki.hudson-ci.org/display/HUDSON/Meet+Hudson).</a></span></span></p>
<p lang="en-GB"><strong>Axe d&#8217;améliorations :</strong></p>
<p lang="en-GB">
<ul>
<li>Ne pas se baser sur le texte de la 	compilation qui est susceptible de changer, mais plutôt sur le code 	de résultat du build.</li>
</ul>
<ul>
<li>Depuis la version 3.0 de Xcode, des erreurs non bloquantes apparaissent dans les logs du build par 	ligne de commande, ce qui rend les logs moins lisibles. Ces erreurs 	sont mentionnées sur les mailing lists mais sans solution 	immédiate, il nous reste à résoudre ce problème.</li>
</ul>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<ul>
<li>Améliorer le contenu des mails 	envoyés afin de synthétiser l’information : en effet, le 	contenu des mails dans l’état actuel est très verbeux et assez 	fastidieux à exploiter. On pourrait recevoir un mail indiquant 	uniquement le statut du build, le nombre de leaks détectés, les 	tests unitaires en échec et un lien vers le détail pour chaque 	section (build, leaks, test). Et éventuellement mettre en place un 	code couleur en fonction de l’urgence du problème remonté dans 	le mail.</li>
</ul>
<p><span style="font-size: small;"><strong>Fuites 	mémoire</strong></span></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --><em>Mise en situation :</em></p>
<p>Un développeur commit du code contenant des fuites mémoires (<span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://fr.wikipedia.org/wiki/Fuite_de_m%C3%A9moire">http://fr.wikipedia.org/wiki/Fuite_de_m%C3%A9moire</a></span></span>). L&#8217;application devient instable et peut crasher à l&#8217;utilisation.</p>
<p><em>Douleur :</em></p>
<p>Encore le coût des erreurs</p>
<p><em>Cause :</em></p>
<p>Il est fastidieux de passer l’analyseur de code à chaque compilation, cela débouche alors sur une mauvaise pratique qui consiste à repousser le « nettoyage » du code. On voit alors parfois apparaître au sein de l&#8217;équipe des tâches techniques « suppression des leaks ». Lorsque ceux-ci sont détectés tardivement, ils deviennent couteux à corriger.</p>
<p><em>Solution :</em></p>
<p>L’UDD permet d’automatiser l’analyse statique du code. Celle-ci permet de détecter toute une série d’anomalies, allant de la fuite mémoire à la faille de sécurité. Nous allons utiliser l&#8217;outil « clang static analyzer », que l’on peut télécharger à cette adresse :</p>
<p><span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://clang-analyzer.llvm.org/">http://clang-analyzer.llvm.org/</a></span></span></p>
<p>N.B : La dernière version de Xcode intègre désormais une analyse de code basée sur le même projet mais intégrée à l’interface graphique (option « build and analyze » dans le menu build).</p>
<p>On récupère un fichier checker-232.tar que l’on va décompresser vers /admin/bin</p>
<p>Dans le dossier checker on trouve 2 exécutables :</p>
<ul>
<li>« scan-build » permet 	de lancer une analyse de code par ligne de commande</li>
<li>« scan-view » permet 	de visualiser les détails des bugs trouvés sous forme de page html</li>
</ul>
<p>On va créer 1 alias de scan-build dans /admin/bin ce qui nous évitera de spécifier le chemin complet vers l’exécutable.</p>
<p>Pour lancer une analyse de code il suffit de lancer la commande :</p>
<p>scan-build [BUILD_COMMAND]</p>
<p>Lorsque l’analyzeur détecte un bug il génère un fichier de rapport et affiche à la fin des logs un message du type :</p>
<p lang="en-GB"><span style="font-size: x-small;">scan-build: 2 bugs found.<br />
scan-build: Run &#8216;scan-view /var/folders/Br/BrQyHE0cHHO0PuV2E4TrlU+++TI/-Tmp-/scan-build-2010-01-19-1&#8242; to examine bug reports.</span></p>
<p>On va donc parser les logs à la recherche du texte : « <span style="font-size: x-small;">Run &#8216;scan-view »</span></p>
<pre class="brush:java">~/bin/scan-build xcodebuild -target "${TARGET_NAME}" -configuration Debug clean -sdk iphoneos3.0
~/bin/scan-build xcodebuild -target "${TARGET_NAME}" -configuration Debug -sdk iphoneos3.0  &gt; /tmp/scanBuildlogIphone.log

SCANRESULT=`grep "Run 'scan-view" /tmp/scanBuildlogIphone.log`

if [ "$SCANRESULT" != "" ]
then
exit 1
fi</pre>
<p><a href="../wp-content/uploads/2010/02/build1-2.txt"><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></a></p>
<p>N.B : il est conseillé d’effectuer l’analyse de code en mode Debug. (<span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://clang-analyzer.llvm.org/scan-build.html">http://clang-analyzer.llvm.org/scan-build.html</a></span></span>)</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p><strong>Axes d&#8217;améliorations :</strong></p>
<ul>
<li>Ici encore on pourrait se baser 	sur le code de retour plutôt que sur le libellé.</li>
<li>Nous pourrions également 	optimiser le contenu des mails plutôt que de fournir les logs de 	l&#8217;analyse.</li>
</ul>
<p><span style="font-size: small;"><strong>Tests 	unitaires :</strong></span><span style="font-size: small;"><strong> </strong></span></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --><strong>Pré-Requis :</strong></p>
<ul>
<li>Mise en place de tests unitaires 	sur iPhone 	(<span style="color: #0000ff;"><span style="text-decoration: underline;"><a href="http://developer.apple.com/iphone/library/documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html">http://developer.apple.com/iphone/library/documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html</a></span></span>)</li>
</ul>
<p><em>Mise en situation :</em></p>
<p>Un développeur commit un fichier qui fait échouer un ou plusieurs tests unitaires.</p>
<p><em>Douleur : </em></p>
<p>Toujours le coût des erreurs</p>
<p><em>Cause :</em></p>
<p>L’exécution des tests peut devenir longue et fastidieuse (nombreux tests d’intégration), cela n&#8217;incite pas les développeurs à les passer systématiquement.</p>
<p><em>Solution :</em></p>
<p>De la même manière qu’en Java, si les tests unitaires sont exécutés automatiquement à chaque commit, on allège le travail d’intégration des différents développements. Nous allons donc automatiser l’exécution de nos tests unitaires à chaque compilation. Si l’un des tests échoue, la compilation sortira en erreur.</p>
<p>Pour cela, nous allons ajouter une dépendance directe entre notre target principale et notre target de test. Ainsi, à chaque compilation de l’application, notre projet sera compilé, puis nos tests seront exécutés. Si l’une ou l’autre de ces étapes échoue, le build sortira en erreur.</p>
<p>Ouvrez votre target principale et dans l’onglet « General » faites « + » dans la liste « Direct dependencies » et ajoutez la target de test.</p>
<p lang="en-GB">
<p lang="en-GB"><a href="http://blog.octo.com/wp-content/uploads/2010/02/capture-conf-target-test-mini.png"><img class="alignnone size-full wp-image-9393" title="capture conf target test mini" src="http://blog.octo.com/wp-content/uploads/2010/02/capture-conf-target-test-mini.png" alt="" width="492" height="299" /></a></p>
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p lang="en-GB">
<p><strong>L’UDD iPhone au quotidien :</strong></p>
<p>Actuellement, 2 développeurs se servent de l’UDD iPhone sur une mission réalisée par Octo. Celle-ci tourne sur un 3<sup>ème</sup> mac qui sert de machine d’intégration et de recette.</p>
<p>Lorsque le build casse, nous recevons un mail avec le log du build et un lien vers le rapport de l’analyse statique de code. Nous avons partagé le répertoire de log du 3<sup>ème</sup> mac ce qui nous permet de les consulter depuis notre poste de développement.</p>
<p>Le mac sur lequel tourne l’UDD sert également d’environnement de recette : sur le bureau se trouve en permanence la dernière version stable de l’application (ainsi qu’un historique des build de l’application), on peut la déployer sur un iPhone via iTunes par un simple drag and drop.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2010/02/schema-udd-simple.png"><img class="alignnone size-full wp-image-9395" title="schema udd simple" src="http://blog.octo.com/wp-content/uploads/2010/02/schema-udd-simple.png" alt="" width="648" height="408" /></a></p>
<p><strong>Conclusion :</strong></p>
<p>La simple mise en place d&#8217;une UDD ne règle pas d&#8217;elle même les problèmes : <strong>il faut des règles partagées par l&#8217;équipe</strong>, notamment concernant la politique de commit : quand et quoi commiter.</p>
<p>Une UDD permet par contre de mettre l&#8217;accent sur ces règles et de <strong>discipliner les pratiques de développement</strong>.</p>
<p>Par ailleurs, tous les problèmes évoqués peuvent être théoriquement réglés «à la main », néanmoins il s&#8217;agit de problèmes liés à la partie « pénible » du travail : lancer les tests régulièrement, archiver des versions stables, intégrer en permanence, etc. L&#8217;UDD permet de rendre cet <strong>effort transparent</strong>.</p>
<p>&#8211;</p>
<p><em>Lien vers le script de build complet : </em></p>
<p><a href="http://blog.octo.com/wp-content/uploads/2010/02/build1-2.txt">BUILD.SH</a></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=9291" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/tour-dhorizon-du-developpement-iphone/' rel='bookmark' title='Tour d&#8217;horizon du développement iPhone'>Tour d&#8217;horizon du développement iPhone</a></li>
<li><a href='http://blog.octo.com/choisir-son-ampli-et-son-usine-de-developpement/' rel='bookmark' title='Choisir son ampli (et son usine de développement)…'>Choisir son ampli (et son usine de développement)…</a></li>
<li><a href='http://blog.octo.com/petit-dej-iphone-as-a-business-platform/' rel='bookmark' title='Petit dej&#8217; : &laquo;&nbsp;iPhone as a business platform&nbsp;&raquo;'>Petit dej&#8217; : &laquo;&nbsp;iPhone as a business platform&nbsp;&raquo;</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/monter-une-usine-de-developpement-iphone/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ce que la science nous dit de la colocalisation</title>
		<link>http://blog.octo.com/ce-que-la-science-nous-dit-de-la-colocalisation/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ce-que-la-science-nous-dit-de-la-colocalisation</link>
		<comments>http://blog.octo.com/ce-que-la-science-nous-dit-de-la-colocalisation/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 16:00:10 +0000</pubDate>
		<dc:creator>Ismaël Héry</dc:creator>
				<category><![CDATA[Méthodologie et conduite du changement]]></category>
		<category><![CDATA[Agilité]]></category>
		<category><![CDATA[changement]]></category>
		<category><![CDATA[Dynamique d'équipe]]></category>
		<category><![CDATA[processus]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=8624</guid>
		<description><![CDATA[Les méthodes agiles recommandent la colocalisation des acteurs (i.e. une localisation physique dans un même bureau) pour une meilleure communication, une meilleure collaboration et globalement une équipe ou un processus projet plus performants. Par exemple Ken Schwaber dans The Enterprise and Scrum : &#171;&#160;High-bandwidth communication is one of the core practices of Scrum… The best [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/devons-nous-changer-de-paradigme-pour-le-developpement-d%e2%80%99applications-informatiques/' rel='bookmark' title='Devons-nous changer de paradigme pour le développement d’applications informatiques?'>Devons-nous changer de paradigme pour le développement d’applications informatiques?</a></li>
<li><a href='http://blog.octo.com/espace-detente/' rel='bookmark' title='Espace détente'>Espace détente</a></li>
<li><a href='http://blog.octo.com/et-si-nous-definissions-simplement-le-cloud-computing/' rel='bookmark' title='Et si nous définissions simplement le Cloud Computing !'>Et si nous définissions simplement le Cloud Computing !</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fce-que-la-science-nous-dit-de-la-colocalisation%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Ce%20que%20la%20science%20nous%20dit%20de%20la%20colocalisation%22%20%7D);"></div>
<p><a href="http://blog.octo.com/wp-content/uploads/2009/12/talks1.png"><img class="alignright size-thumbnail wp-image-8659" title="talks" src="http://blog.octo.com/wp-content/uploads/2009/12/talks1-150x150.png" alt="" width="150" height="150" /></a><br />
Les méthodes agiles recommandent la colocalisation des acteurs (i.e. une localisation physique dans un même bureau) pour une meilleure communication, une meilleure collaboration et globalement une équipe ou un processus projet plus performants. Par exemple Ken Schwaber dans <a href="http://www.amazon.com/Enterprise-Scrum-Ken-Schwaber/dp/0735623376">The Enterprise and Scrum</a> :</p>
<blockquote><p>&laquo;&nbsp;High-bandwidth communication is one of the core practices of Scrum… The best communication is face to face, with communications occurring through facial expression, body language, intonation, and words.&nbsp;&raquo;</p></blockquote>
<p>Que disent les sciences de ce sujet aujourd’hui âprement discuté dans la communauté agile et ô combien toujours délicat à mettre en œuvre dans les faits ?<br />
<span id="more-8624"></span><br />
Ce principe de colocalisation fait débat dans la communauté agile, maintenant que les méthodes agiles, en passe de devenir « mainstream », sont déployées bien au-delà de « petites » équipes colocalisées.<br />
Même dans le cas d’équipes « colocalisables » dans les faits, on mesure la distance de la coupe aux lèvres lorsque les organisations doivent faire le pas et que les obstacles se dressent, notamment :</p>
<ul>
<li>une remise en cause délicate des frontières organisationnelles dès lors que des acteurs de différents silos sont amenés à partager au quotidien un même espace de travail (ex : MOA/MOE/marketing/intégration/exploitation&#8230;);</li>
<li>des demandes d&#8217;aide pour le moins fastidieuses vis-à-vis des tout puissants « services généraux » ;</li>
<li>un impact sur l’ensemble des acteurs projet, au-delà de la population des développeurs, seule astreinte aux nouvelles disciplines comme le pair programming, TDD ou l’intégration continue.</li>
</ul>
<p>Les multiples réticences à la mise en place d&#8217;équipe colocalisées ou le débat au sein de la communauté agile doivent nous inciter à étayer notre discours plus solidement que « c&#8217;est une bonne pratique agile qui est indispensable/facultative » ou « la colocalisation/non-colocalisation a bien/mal marché dans nos projets précédents ».</p>
<p>A cette fin, les très nombreuses études scientifiques dans ce domaine sont une source quasi jamais explorée dans les communautés agile et lean. Par exemple, la psychologie sociale, discipline hautement empirique ou des disciplines plus spécialisées comme le domaine du <a href="http://en.wikipedia.org/wiki/Computer_supported_cooperative_work">Computer Supported Collaborative Work</a> (CSCW), ont accumulé depuis plus de 30 ans les expériences, études et publications sur l&#8217;efficacité de la communication et de la collaboration en fonction de la distribution physique des membres de l&#8217;équipe.</p>
<h2>Un résultat classique : la courbe d’Allen</h2>
<p>Thomas Allen, professeur au MIT et auteur de l’ouvrage de référence <a href="http://www.amazon.com/Managing-Flow-Technology-Dissemination-D-Organization/dp/0262010488">Managing the Flow of Technology</a> en 1977, a étudié la probabilité de communication au sein d’une équipe en fonction de la distance.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2009/12/communication-probability3.png"><img class="aligncenter size-full wp-image-8651" title="Probabilité de communication en fonction de la distance" src="http://blog.octo.com/wp-content/uploads/2009/12/communication-probability3.png" alt="" width="877" height="341" /></a></p>
<p>Le profil de la &laquo;&nbsp;<a href="http://en.wikipedia.org/wiki/Allen_curve">courbe d&#8217;Allen</a>&nbsp;&raquo; est une décroissance exponentielle dont on peut extraire quelques points représentatifs :</p>
<ul>
<li>au-delà de 9 mètres, il y a moins d’une chance sur 10 pour que 2 acteurs communiquent une fois dans la semaine ;</li>
<li>il y a deux fois plus d’échanges pour 2 acteurs séparés de 10 mètres que pour 2 acteurs séparés de 20 mètres.</li>
</ul>
<p>Par exemple, 2 acteurs situés dans deux bureaux même proches (disons à 20 m) auront 2 fois moins d&#8217;échange que 2 acteurs à 10 m de distance sur un même plateau.</p>
<p>Et chez vous ?</p>
<ul>
<li>Quels sont vos 3 interlocuteurs privilégiés ? A quelle distance sont-ils de vous ?</li>
<li>Dans vos équipes projet, quelles sont les distances entre des interlocuteurs proches dans la chaîne de valeur (par exemple : marketing=&gt;MOA=&gt;MOE=&gt;intégration=&gt;exploitation) ?</li>
</ul>
<h2>Oui mais l’email, l’instant messaging, la vidéo ?</h2>
<p>Les moyens de communication modernes (email, IM, vidéo conférence) largement déployés depuis les premiers résultats de Allen ont-ils remis en cause l’importance de la distance ?</p>
<p>Pas vraiment… voire c’est tout le contraire qui apparait au fil des études puisque la probabilité d’interaction par ces nouveaux moyens de communication est corrélée à la distance. Ainsi, Allen dans son ouvrage récent (2008), <a href="http://www.amazon.com/Organization-Architecture-Innovation-Managing-Technology/dp/0750682361">The Organization and Architecture of Innovation</a> :</p>
<blockquote><p>&laquo;&nbsp;We do not keep separate sets of people, some of which we communicate in one medium and some by another. <strong>The more often we see someone face-to-face, the more likely it is that we will telephone the person or communicate in some other medium</strong>.&nbsp;&raquo;</p></blockquote>
<h2>Google, encore Google…</h2>
<p><a href="http://www.bocowgill.com/GooglePredictionMarketPaper.pdf">Une étude à grande échelle</a> basée sur un <a href="http://fr.wikipedia.org/wiki/March%C3%A9_de_pr%C3%A9diction">marché de prédiction</a> et menée dans les centres de Google, confirme les résultats classiques de Allen.</p>
<p>Un des auteurs de l’étude, Justin Wolfers, <a href="http://freakonomics.blogs.nytimes.com/2008/01/14/prediction-markets-at-google-a-guest-post/">commente les résultats de l’étude</a> :</p>
<blockquote><p>&laquo;&nbsp;<strong>Sitting within a few feet of a workmate has a big effect</strong>. (Our data includes the exact GPS coordinates of each person’s desk, as well as their previous desks.)<br />
Beyond this, <strong>sitting on the same floor as someone barely has any effect.</strong><br />
[…]<br />
<strong>The overwhelming importance of “micro-geography” was quite striking, particularly as this is the sort of organization in which Instant Messaging and e-mail (plus blogs and wikis) might have otherwise suggested the death of distance.&nbsp;&raquo;</strong></p></blockquote>
<p>Eric Schmidt, CEO de Google, n’a pas attendu les résultats de cette étude pour souligner l’importance  de la colocalisation. Pour preuve la 3ème règle (&laquo;&nbsp;Pack them in&nbsp;&raquo;) des <a href="http://www.msnbc.msn.com/id/10296177/site/newsweek/print/1/displaymode/1098/" class="broken_link">Google Ten Golden Rules</a>.</p>
<blockquote><p>&laquo;&nbsp;<strong>The best way to make communication easy is to put team members within a few feet of each other</strong>. The result is that virtually everyone at Google shares an office. This way, when a programmer needs to confer with a colleague, there is immediate access: <strong>no telephone tag, no e-mail delay, no waiting for a reply</strong>.&nbsp;&raquo;</p></blockquote>
<p>A cet égard, le modèle Google et sa confirmation par l&#8217;étude expérimentale éclaire d&#8217;autant plus nos propres contextes IT :</p>
<ul>
<li>Les employés Google ont a leur disposition tous les outils de communication technologiques possibles et imaginables (faisons l&#8217;hypothèse qu&#8217;ils savent les utiliser correctement) ;</li>
<li>Le métier de Google ressemble de près ou de loin au métier de nos équipes projets (i.e. concevoir et construire vite et bien de nouveaux produits IT) ;</li>
</ul>
<h2>Effet de la distance sur la collaboration, le mensonge et la recherche de compromis</h2>
<p>Les résultats évoqués jusqu’ici concernent la probabilité de communication en fonction de la distance. D’autres études en psychologie sociales se sont attachées à mesurer les effets de la distance sur la propension à collaborer, tromper son interlocuteur ou trouver efficacement des compromis.</p>
<p>Ainsi, dans l&#8217;étude <a href="http://portal.acm.org/citation.cfm?id=587078.587110">Why Distance Matters</a> :</p>
<blockquote><p>&laquo;&nbsp;First, the data strongly indicates that the geographic distance between collaborating and previously unacquainted partners matters. <strong>The ability to persuade another and the willingness to initially cooperate decrease with distance while deception of another person increases with distance.&nbsp;&raquo;</strong></p></blockquote>
<p>Au passage, cette étude balaie aussi l&#8217;espoir parfois mis dans des outils technologiques plus &laquo;&nbsp;riches&nbsp;&raquo;. Ainsi, la qualité de la collaboration, la propension au mensonge et aux compromis, sont sensiblement les mêmes que les acteurs utilisent un simple &laquo;&nbsp;instant messaging&nbsp;&raquo; ou la vidéo conférence.</p>
<h2>Conclusion</h2>
<p>Les résultats cités dans ce post dépassent le cadre des méthodes agiles ou même du développement logiciel : tous les &laquo;&nbsp;jeux&nbsp;&raquo; collaboratifs, créatifs et innovants (notamment tous les types de &laquo;&nbsp;new product development&nbsp;&raquo;) retireront énormément de la co-localisation.</p>
<p>Les disciplines scientifiques comme la psychologie sociale peuvent nous fournir des résultats expérimentaux probants à la fois dans le débat au sein de la communauté agile mais surtout comme argument de poids dans la mise en place d’équipe colocalisées. Le lecteur intéressé par les détails des protocoles et des données expérimentales recueillies pourra se reporter aux études pointées tout au long du post.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=8624" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/devons-nous-changer-de-paradigme-pour-le-developpement-d%e2%80%99applications-informatiques/' rel='bookmark' title='Devons-nous changer de paradigme pour le développement d’applications informatiques?'>Devons-nous changer de paradigme pour le développement d’applications informatiques?</a></li>
<li><a href='http://blog.octo.com/espace-detente/' rel='bookmark' title='Espace détente'>Espace détente</a></li>
<li><a href='http://blog.octo.com/et-si-nous-definissions-simplement-le-cloud-computing/' rel='bookmark' title='Et si nous définissions simplement le Cloud Computing !'>Et si nous définissions simplement le Cloud Computing !</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/ce-que-la-science-nous-dit-de-la-colocalisation/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>FitNesse, Maven, Hudson : pour une intégration continue des tests d’acceptance</title>
		<link>http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%25e2%2580%2599acceptance</link>
		<comments>http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 09:58:28 +0000</pubDate>
		<dc:creator>Jean-Loup YU</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[fitnesse]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=6722</guid>
		<description><![CDATA[Dans un projet d’entreprise, il est important de vérifier continuellement la non-régression du produit réalisé. Au même titre que les tests unitaires, les tests d’acceptance font partie intégrante du harnais de tests à mettre en place sur un projet. FitNesse est une des solutions à ce besoin. FitNesse / Slim FitNesse dormait jusqu’à Juillet 2008. [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/les-tests-de-recette-automatises-avec-fitnesse/' rel='bookmark' title='Les tests de recette automatisés avec Fitnesse'>Les tests de recette automatisés avec Fitnesse</a></li>
<li><a href='http://blog.octo.com/integration-continue-performante-1/' rel='bookmark' title='Intégration continue performante (Part #1)'>Intégration continue performante (Part #1)</a></li>
<li><a href='http://blog.octo.com/mise-en-place-technique-de-fitnesse/' rel='bookmark' title='Mise en place technique de FitNesse'>Mise en place technique de FitNesse</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Ffitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%2525e2%252580%252599acceptance%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22FitNesse%2C%20Maven%2C%20Hudson%20%3A%20pour%20une%20int%C3%A9gration%20continue%20des%20tests%20d%E2%80%99acceptance%22%20%7D);"></div>
<p>Dans un projet d’entreprise, il est important de vérifier continuellement la non-régression du produit réalisé. Au même titre que les tests unitaires, les tests d’acceptance font partie intégrante du harnais de tests à mettre en place sur un projet. FitNesse est une des solutions à ce besoin.</p>
<h2>FitNesse / Slim</h2>
<p><a title="fitnesse.org" href="http://fitnesse.org/">FitNesse </a>dormait jusqu’à Juillet 2008. Mais il suffit de voir le rythme des releases depuis cette date, pour se rendre compte qu’il s’est réveillé ! Avec une nouvelle version presque tous les mois entre Juillet 2008 et Juillet 2009, et l’arrivée de <a title="Slim overview" href="http://vimeo.com/2456352">Slim</a>, on obtient un produit qui a sensiblement changé.</p>
<p>Mais avec une évolution aussi soudaine, on ne peut malheureusement pas éviter les effets de bords. Notamment dans le monde des outils qui tournaient autour de la sphère FitNesse. Par exemple, je recherchais un plugin Maven pour FitNesse. Mais la plupart des liens que me renvoie mon moteur de recherche préféré, pointe sur des outils incompatibles avec les nouvelles versions de FitNesse.</p>
<p>Il faut creuser un peu avant de trouver les perles rares…</p>
<p><span id="more-6722"></span></p>
<h2>Intégration avec Maven</h2>
<h3>Classpath generator</h3>
<p>Dès qu’on joue un peu avec FitNesse, on se rend vite compte que la gestion du classpath est une vraie galère ! L’écriture manuelle n’est pas une solution envisageable lorsque le projet embarque plus d’une dizaine de dépendances. Et puis après tout c’est le rôle de Maven de gérer tout ça !</p>
<p>C’est là qu’entre en jeu le superbe plugin <a title="Classpath generator plugin" href="https://source.valtech.com/display/vfl/Maven+Fitnesse+Classpath+Generator+Plugin">Classpath generator</a>.</p>
<p>Compatible avec la dernière version de FitNesse (<a title="fitnesse download" href="http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad">20090818</a>), il permet de générer automatiquement la liste des dépendances des fixtures décrites dans le pom, directement dans le wiki.</p>
<p>Pour savoir comment configurer le plugin et comment l’utiliser, il suffit de suivre ce <a title="plugin configuration" href="https://source.valtech.com/maven-sites/maven-fitnesse-cpgen-plugin/usage.html">lien</a>.<br />
Attention, la page dans laquelle vous souhaitez générer le classpath doit être de type « Suite ».</p>
<h3>Trinidad</h3>
<p>L’étape suivante consiste à intégrer l’exécution automatique des tests d’acceptance dans le processus de build du projet.  Pour cela, il existe le plugin Maven nommé <a title="Trinidad plugin" href="http://neuri.co.uk/resources/projects/trinidad/maven-trinidad-plugin/">Trinidad</a>. Nous nous  concentrons ici uniquement sur l’aspect exécution des tests FitNesse dans Maven, sachant que le plugin permet de faire bien plus que ça.</p>
<p>Pour cela, je vous décris dans la suite comment j’ai configuré et utilisé le plugin.</p>
<p>Configuration du pom.xml du projet contenant les fixtures :</p>
<p>Ajout de la dépendance :</p>
<pre class="brush:xml">&lt;project&gt; 
  &lt;repositories&gt; 
    &lt;repository&gt; 
      &lt;id&gt;neuri-maven&lt;/id&gt; 
      &lt;url&gt;http://maven.neuri.com/&lt;/url&gt; 
      &lt;snapshots&gt; 
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/snapshots&gt; 
      &lt;releases&gt;
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/releases&gt;
    &lt;/repository&gt; 
  &lt;/repositories&gt; 
  &lt;dependencies&gt;
    &lt;dependency&gt; 
      &lt;groupid&gt;com.neuri.tdd&lt;/groupid&gt; 
      &lt;artifactid&gt;fitnesserunner&lt;/artifactid&gt; 
      &lt;version&gt;20090818&lt;/version&gt; 
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
&lt;/project&gt;</pre>
<p>Configuration du plugin :</p>
<pre class="brush:xml">&lt;project&gt;
  &lt;build&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;artifactid&gt;maven-trinidad-plugin&lt;/artifactid&gt;
        &lt;version&gt;20090818&lt;/version&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;phase&gt;test&lt;/phase&gt; 
            &lt;goals&gt;
              &lt;goal&gt;run-tests&lt;/goal&gt;
            &lt;/goals&gt; 
          &lt;/execution&gt;
        &lt;/executions&gt;
        &lt;configuration&gt;
          &lt;testengine&gt;slim&lt;/testengine&gt; 
          &lt;testrepositorytype&gt;fitnesse&lt;/testrepositorytype&gt;
          &lt;testrepositoryuri&gt;C:\Programs\fitnesse&lt;/testrepositoryuri&gt; 
          &lt;breakbuildonfailure&gt;true&lt;/breakbuildonfailure&gt; 
          &lt;suites&gt; 
            &lt;suite&gt;MyProject.MyTestSuite&lt;/suite&gt; 
          &lt;/suites&gt; 
        &lt;/configuration&gt;
      &lt;/plugin&gt; 
    &lt;/plugins&gt; 
  &lt;/build&gt; 
  &lt;pluginrepositories&gt; 
    &lt;pluginrepository&gt; 
      &lt;id&gt;neuri-maven&lt;/id&gt; 
      &lt;url&gt;http://maven.neuri.com/&lt;/url&gt; 
      &lt;snapshots&gt; 
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/snapshots&gt; 
      &lt;releases&gt; 
        &lt;enabled&gt;true&lt;/enabled&gt; 
      &lt;/releases&gt; 
    &lt;/pluginrepository&gt; 
  &lt;/pluginrepositories&gt;
&lt;/project&gt;</pre>
<p>Ainsi configuré, tous les tests FitNesse inclus dans la suite « MyTestSuite » seront exécutés lors du lancement de la phase test de Maven.</p>
<p>Le paramètre « breakBuildOnFailure » permet comme son nom l’indique de casser le build en cas d’échec sur les tests d’acceptance. Par défaut, le paramètre est à false.</p>
<h2>Hudson</h2>
<p>L’usine d’intégration continue est une brique logiciel essentielle dans un projet agile. Il garantit l’intégrité de l’application construite au fil de l’eau. Hudson est un des outils les plus répandus. Intégrer les tests d’acceptance dans l’usine d’intégration continue participe donc à construire un logiciel de qualité.</p>
<p>Par contre, on est en droit de se demander s’il est indispensable d’exécuter les tests d’acceptance à chaque fois que l’application est construite (c’est-à-dire à chaque commit d’un développeur). En effet, les tests FitNesse sont souvent longs à exécuter, et les jouer à chaque fois peut parfois nuire à la productivité de l’équipe. Un bon compromis est de lancer le build des tests d’acceptance toutes les nuits.</p>
<p>Voici comment j’ai configuré le job Hudson qui exécute les tests FitNesse tous les jours à minuit:</p>
<p style="text-align: center;"><img class="aligncenter" title="hudson1" src="http://blog.octo.com/wp-content/uploads/2009/10/hudson1.GIF" alt="hudson1" width="700" height="500" /></p>
<p><img title="hudson2" src="http://blog.octo.com/wp-content/uploads/2009/10/hudson2.GIF" alt="hudson2" width="700" height="600" /></p>
<p>Malgré une version stable depuis Août 2009, FitNesse peut être amené à évoluer dans quelques mois. Cet article se base sur la version <a title="fitnesse download" href="http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad">20090818</a>. Les outils présentés ont été testés sur cette version. Il n’est pas garantit qu’ils fonctionneront toujours avec les versions futures de FitNesse.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=6722" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/les-tests-de-recette-automatises-avec-fitnesse/' rel='bookmark' title='Les tests de recette automatisés avec Fitnesse'>Les tests de recette automatisés avec Fitnesse</a></li>
<li><a href='http://blog.octo.com/integration-continue-performante-1/' rel='bookmark' title='Intégration continue performante (Part #1)'>Intégration continue performante (Part #1)</a></li>
<li><a href='http://blog.octo.com/mise-en-place-technique-de-fitnesse/' rel='bookmark' title='Mise en place technique de FitNesse'>Mise en place technique de FitNesse</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/fitnesse-maven-hudson-pour-une-integration-continue-des-tests-d%e2%80%99acceptance/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

