<?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/"
	>

<channel>
	<title>Pims Labs &#187; Qualité</title>
	<atom:link href="http://labs.pimsworld.org/category/qualite/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.pimsworld.org</link>
	<description>Les labs de Pims World</description>
	<pubDate>Thu, 28 May 2009 08:15:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tests unitaires avec Zend Studio</title>
		<link>http://labs.pimsworld.org/2009/01/tests-unitaires-avec-zend-studio/</link>
		<comments>http://labs.pimsworld.org/2009/01/tests-unitaires-avec-zend-studio/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 18:09:02 +0000</pubDate>
		<dc:creator>Kal</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Tests Unitaires]]></category>

		<category><![CDATA[Tutoriels]]></category>

		<category><![CDATA[PHPUnit]]></category>

		<category><![CDATA[tests unitaires]]></category>

		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://labs.pimsworld.org/?p=10</guid>
		<description><![CDATA[Si vous êtes persuadés de l'intérêt des tests unitaires pour vos développements PHP mais que vous n'avez jamais osé franchir le pas, ce tutoriel est fait pour vous. Afin de migrer en douceur vers les préceptes sacrés de l'eXtreme Programming je vous propose un exemple concret de mise en place des tests unitaires sous l'environnement Zend Studio.]]></description>
			<content:encoded><![CDATA[<p>Si vous êtes persuadés de l&#8217;intérêt des tests unitaires pour vos développements PHP mais que vous n&#8217;avez jamais osé franchir le pas, ce tutoriel est fait pour vous. Afin de migrer en douceur vers les préceptes sacrés de l&#8217;eXtreme Programming je vous propose un exemple concret de mise en place des tests unitaires sous l&#8217;environnement Zend Studio.</p>
<p><span id="more-10"></span></p>
<p>Pour ce faire, nous allons implémenter une bonne vieille <strong>pile LIFO</strong> en PHP.</p>
<p>Après avoir crée un projet avec Zend Studio et une classe <strong>Unit_Stack</strong>, on commence par écrire le squelette de cette classe :</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co4">/**<br />
* A LIFO Stack<br />
*/</span><br />
<span class="kw2">class</span> Unit_Stack<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co4">/**<br />
&nbsp; &nbsp; * Push an item.<br />
&nbsp; &nbsp; *<br />
&nbsp; &nbsp; * @param mixed $item<br />
&nbsp; &nbsp; *<br />
&nbsp; &nbsp; * @return void<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> push<span class="br0">&#40;</span><span class="re0">$item</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co4">/**<br />
&nbsp; &nbsp; * Pop an item.<br />
&nbsp; &nbsp; *<br />
&nbsp; &nbsp; * @return mixed<br />
&nbsp; &nbsp; * @throws Exception if stack is empty.<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> pop<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co4">/**<br />
&nbsp; &nbsp; * Count items of stack.<br />
&nbsp; &nbsp; *<br />
&nbsp; &nbsp; * @return int<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> <a href="http://www.php.net/count"><span class="kw3">count</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co4">/**<br />
&nbsp; &nbsp; * Tells if stack is empty.<br />
&nbsp; &nbsp; *<br />
&nbsp; &nbsp; * @return boolean<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> isEmpty<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co4">/**<br />
&nbsp; &nbsp; * Removes all items of stack.<br />
&nbsp; &nbsp; *<br />
&nbsp; &nbsp; * @return void<br />
&nbsp; &nbsp; */</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> <a href="http://www.php.net/reset"><span class="kw3">reset</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div></div>
<p>Les commentaires devraient suffire à expliquer ce qu&#8217;est sensée faire cette classe.</p>
<p>L&#8217;étape suivante consiste à créer la classe de tests unitaires ou <strong>Test Case</strong>. Dans l&#8217;arborescence <em>tests/unit/Unit/</em>, faire click droit puis <strong>new -&gt; PHPUnit Test Case</strong>.</p>
<p>Il suffit alors de choisir la classe à tester via le bouton <strong>Browse</strong> en face de<strong> &#8216;Element to Test&#8217;</strong>, puis de corriger le nom de la classe de Test générée dans le champ <strong>&#8216;Test File Name&#8217;</strong> en virant le préfixe Unit_&#8217;. Cela devrait ressembler à ça :</p>
<div id="attachment_143" class="wp-caption aligncenter" style="width: 532px"><img class="size-full wp-image-143" src="http://labs.pimsworld.org/wp-content/uploads/2009/01/unit1.png" alt="Création d'un Test Case" width="522" height="497" /><p class="wp-caption-text">Création d&#39;un Test Case</p></div>
<p>Le <strong>Test Case</strong> généré devrait comprendre :</p>
<ul>
<li>une méthode setUp : lancée avant chaque test.</li>
<li>une méthode tearDown : lancée après chaque test.</li>
<li>un constructeur : pas vraiment utile.</li>
<li>une méthode de test par méthode publique de la classe à tester.</li>
</ul>
<p>Dans le cadre de cet exemple, je vous invite à supprimer le constructeur ainsi que les méthodes setUp et tearDown.</p>
<p>Nous rentrons maintenant dans le vif du sujet, il s&#8217;agit :</p>
<ol>
<li>d&#8217;écrire un test</li>
<li>de lancer le Test Case afin de vérifier (oh surprise) qu&#8217;il échoue</li>
<li>d&#8217;implémenter la fonctionnalité</li>
<li>de relancer le test et éventuellement corriger jusqu&#8217;à ce que le test passe !</li>
</ol>
<h2>Écriture du test</h2>
<p>Nous proposons pour la méthode <strong>isEmpty</strong> l&#8217;écriture du test suivant :</p>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">public</span> <span class="kw2">function</span> testIsEmpty <span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$stack</span> <span class="sy0">=</span> <span class="kw2">new</span> Unit_Stack<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">// a new stack is empty !</span><br />
&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">assertTrue</span><span class="br0">&#40;</span><span class="re0">$stack</span><span class="sy0">-&gt;</span><span class="me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></div>
<h2>Lancer le Test Case</h2>
<p>Il suffit d&#8217;un click droit sur le fichier du <strong>Test Case</strong> puis de choisir <strong>Run as -&gt; PHPUnit Test</strong></p>
<p>Si tout se passe bien, le test devrait apparaître en erreur et les autres en non implémentés.</p>
<h2>
<p><div id="attachment_146" class="wp-caption aligncenter" style="width: 458px"><img class="size-full wp-image-146" src="http://labs.pimsworld.org/wp-content/uploads/2009/01/unit11.png" alt="Résultats test case" width="448" height="173" /><p class="wp-caption-text">Résultats test case</p></div></h2>
<h2>Implémenter la fonctionnalité</h2>
<div class="codecolorer-container php " style="overflow:auto;white-space:nowrap;width:540px"><div class="php codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">public</span> <span class="kw2">function</span> isEmpty<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span>_array<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></div>
<p>Trop facile &#8230;</p>
<h2>Relancer le test et corriger</h2>
<p>Même procédure que le lancement précédent, cette fois le test devrait apparaître comme réussi.</p>
<h2>Ensuite&#8230;.</h2>
<p>Il suffit de refaire la même procédure itérativement pour chaque fonctionnalité. A mesure que les nouvelles fonctionnalités sont implémentées, de nouveaux tests peuvent être écrits en plus de ceux générés par Zend Studio. Il suffit de créer une méthode publique dont le nom commence par <strong>test</strong>.</p>
<p>Si votre application contient plusieurs classes et donc plusieurs Test Case (ce qui est souvent le cas !), il peut être fastidieux de lancer les tests cases un par un, il est alors intéressant d&#8217;utiliser les <strong>Tests Suites</strong>. Il suffit de faire un click droit dans Zend studio sur le répertoire <em>test/unit/</em> puis <strong>New -&gt; PHPUnit Test Suite</strong>.</p>
<p>On sélectionne alors les Tests Case à lancer puis finish. Une Suite se lance alors de le même façon qu&#8217;un Test Case.</p>
<p>Liens :</p>
<ul>
<li>Les sources de <a href="http://labs.pimsworld.org/download/test.zip" target="_blank">l&#8217;exemple</a></li>
<li>Le site de <a href="http://www.phpunit.de/" target="_blank">PhpUnit </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://labs.pimsworld.org/2009/01/tests-unitaires-avec-zend-studio/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Phing automatise les opérations répétitives des développements PHP</title>
		<link>http://labs.pimsworld.org/2009/01/phing-automatise-les-operations-repetitives-des-developpements-php/</link>
		<comments>http://labs.pimsworld.org/2009/01/phing-automatise-les-operations-repetitives-des-developpements-php/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 11:09:18 +0000</pubDate>
		<dc:creator>Stéphane Roucheray</dc:creator>
		
		<category><![CDATA[Intégration Continue]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Tutoriels]]></category>

		<category><![CDATA[automatisation]]></category>

		<category><![CDATA[ligne de commande]]></category>

		<category><![CDATA[svn]]></category>

		<category><![CDATA[tests unitaires]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://labs.pimsworld.org/?p=74</guid>
		<description><![CDATA[Phing est un outil Open Source d'automatisation des tâches répétitives pour les projets de développement PHP. Ce tutoriel rapide sur l'utilisation et l'installation de Phing vous permettra de créer rapidement vos premières tâches avec Phing. ]]></description>
			<content:encoded><![CDATA[<p>L&#8217;automatisation des opérations répétitives dans un projet de développement peut être résolue de multiples manières allant du simple script lancé à la main au système d&#8217;intégration continue.</p>
<p>La plupart des langages ont standardisé leurs outils, <a href="http://fr.wikipedia.org/wiki/Make">make</a> pour C, <a href="http://fr.wikipedia.org/wiki/Apache_Ant">Ant</a> pour Java&#8230; PHP bénéficie lui aussi d&#8217;un tel outil : <a href="http://phing.info">Phing</a>.</p>
<p>Phing est un projet Open Source très inspiré de Ant. Le concept est assez simple. Un fichier XML décrit une série d&#8217;actions possibles pouvant ou non être dépendantes les unes des autres et une ligne de commande permet de déclencher ces actions.</p>
<h2>Utilisation de Phing</h2>
<p>Un exemple rapide. Nous voulons vérifier que la syntaxe des fichiers PHP de notre projet est bien respectée, qu&#8217;aucune erreur ne s&#8217;y est glissée, le fichier XML ressemble alors à ça :</p>
<p><strong>Fichier build.xml</strong></p>
<div class="codecolorer-container xml " style="overflow:auto;white-space:nowrap;width:540px"><div class="xml codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;premier_projet&quot;</span> <span class="re0">default</span>=<span class="st0">&quot;lint&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;lint&quot;</span> <span class="re0">description</span>=<span class="st0">&quot;Vérifie la syntaxe PHP&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;phplint<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;fileset</span> <span class="re0">dir</span>=<span class="st0">&quot;/home/mon_projet/src/&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include</span> <span class="re0">name</span>=<span class="st0">&quot;**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;exclude</span> <span class="re0">name</span>=<span class="st0">&quot;lib/Zend/**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/fileset<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/phplint<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span></div></div>
<p>Enregistrez ce fichier avec le nom build.xml (le fichier par défaut utilisé par phing) dans le dossier build de votre projet, par exemple</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sy0">/</span>home<span class="sy0">/</span>mon_projet<span class="sy0">/</span>build<span class="sy0">/</span></div></div>
<p>Ouvrez une console et lancez ensuite la commande phing depuis le dossier du fichier build.xml</p>
<p><strong>Commande</strong></p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw3">cd</span> <span class="sy0">/</span>home<span class="sy0">/</span>mon_projet<span class="sy0">/</span>build<span class="sy0">/</span><br />
phing</div></div>
<p>Le fichier build.xml est très explicite, cette commande va donc vérifier, pour tous les fichiers PHP de mon dossier source a l&#8217;exclusion de ceux de la bibliothèque Zend, que leur syntaxe est bien respectée.</p>
<p>Autre exemple, pour générer automatiquement la documentation de classes PHP.</p>
<p><strong>Fichier build.xml</strong></p>
<div class="codecolorer-container xml " style="overflow:auto;white-space:nowrap;width:540px"><div class="xml codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;premier_projet&quot;</span> <span class="re0">default</span>=<span class="st0">&quot;doc&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;doc&quot;</span> <span class="re0">description</span>=<span class="st0">&quot;Génère la documentation&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;phpdoc</span> <span class="re0">title</span>=<span class="st0">&quot;API Documentation&quot;</span></span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">destdir</span>=<span class="st0">&quot;/home/mon_projet/api&quot;</span></span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">sourcecode</span>=<span class="st0">&quot;no&quot;</span> <span class="re0">output</span>=<span class="st0">&quot;HTML:Smarty:PHP&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;fileset</span> <span class="re0">dir</span>=<span class="st0">&quot;/home/mon_projet/src/&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include</span> <span class="re0">name</span>=<span class="st0">&quot;**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;exclude</span> <span class="re0">name</span>=<span class="st0">&quot;lib/Zend/**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/fileset<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/phpdoc<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span></div></div>
<p><strong>Commandes</strong></p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw3">cd</span> <span class="sy0">/</span>home<span class="sy0">/</span>mon_projet<span class="sy0">/</span>build<span class="sy0">/</span><br />
phing</div></div>
<p>Phing tout comme Ant gère la dépendance des tâches. Dans notre cas, si nous voulons générer la documentation après la vérification syntaxique. Il suffit de modifier notre fichier build.xml comme suit :</p>
<p><strong>Fichier build.xml</strong></p>
<div class="codecolorer-container xml " style="overflow:auto;white-space:nowrap;width:540px"><div class="xml codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;premier_projet&quot;</span> <span class="re0">default</span>=<span class="st0">&quot;build&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;lint&quot;</span> <span class="re0">description</span>=<span class="st0">&quot;Vérifie la syntaxe PHP&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;phplint<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;fileset</span> <span class="re0">dir</span>=<span class="st0">&quot;/home/mon_projet/src/&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include</span> <span class="re0">name</span>=<span class="st0">&quot;**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;exclude</span> <span class="re0">name</span>=<span class="st0">&quot;lib/Zend/**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/fileset<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/phplint<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;doc&quot;</span> <span class="re0">description</span>=<span class="st0">&quot;Génère la documentation&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;phpdoc</span> <span class="re0">title</span>=<span class="st0">&quot;API Documentation&quot;</span> </span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">destdir</span>=<span class="st0">&quot;/home/mon_projet/api&quot;</span></span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">sourcecode</span>=<span class="st0">&quot;no&quot;</span></span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">output</span>=<span class="st0">&quot;HTML:Smarty:PHP&quot;</span><span class="re2">&gt;</span></span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;fileset</span> <span class="re0">dir</span>=<span class="st0">&quot;/home/mon_projet/src/&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;include</span> <span class="re0">name</span>=<span class="st0">&quot;**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;exclude</span> <span class="re0">name</span>=<span class="st0">&quot;lib/Zend/**/*.php&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/fileset<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/phpdoc<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> </span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">name</span>=<span class="st0">&quot;build&quot;</span></span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">depends</span>=<span class="st0">&quot;lint, doc&quot;</span></span><br />
<span class="sc3">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">description</span>=<span class="st0">&quot;Syntaxe PHP et Documentation&quot;</span> <span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/project<span class="re2">&gt;</span></span></span></div></div>
<p><strong>Commande</strong></p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">phing</div></div>
<p>La commande <tt>phing</tt> va automatiquement séquencer les 2 tâches <tt>lint</tt> et <tt>doc</tt> car la tâche <tt>build</tt> dépend d&#8217;elles.<br />
Si nous voulons seulement générer la documentation il suffit de taper la commande suivante.</p>
<p><strong>Commande</strong></p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">phing doc</div></div>
<p>Phing est très puissant. Il permet de gérer des tâches conditionnelles, des tâches spécifiques PHP comme l&#8217;analyse de code par le compilateur Zend, le lancement de tests unitaires classiques ou avec <a href="http://labs.pimsworld.org/2008/12/installation-de-selenium-rc-sous-ubuntu">Selenium</a>. Il sait aussi piloter des tâches plus génériques comme l&#8217;update de dépôt SVN ou l&#8217;exécution de commandes externes. La liste longue et complète des tâches disponibles se trouve dans la documentation de <a href="http://phing.info/docs/guide/current/">Phing</a>.</p>
<h2>Installation de Phing</h2>
<p>Pour installer Phing, le plus simple est d&#8217;utiliser PEAR. Sous Ubuntu tapez les commandes suivantes en mode super utilisateur.</p>
<p><strong>Installation de PEAR, la bibliothèque d&#8217;extensions à PHP</strong></p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">apt-get</span> <span class="kw2">install</span> php-pear</div></div>
<p><strong>Installation de Phing</strong></p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">pear channel-discover pear.phing.info<br />
pear <span class="kw2">install</span> phing<span class="sy0">/</span>phing</div></div>
<h2>On en parle ailleurs&#8230;</h2>
<p>Un <a href="http://nsslive.net/2009/02/16/shell-scripts-no-more/">article en anglais de Nabeel Shahzad</a> décrit comment il s&#8217;est débarrassé des scripts grâce à Phing </p>
]]></content:encoded>
			<wfw:commentRss>http://labs.pimsworld.org/2009/01/phing-automatise-les-operations-repetitives-des-developpements-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installation de Selenium RC sous ubuntu</title>
		<link>http://labs.pimsworld.org/2008/12/installation-de-selenium-rc-sous-ubuntu/</link>
		<comments>http://labs.pimsworld.org/2008/12/installation-de-selenium-rc-sous-ubuntu/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 17:36:31 +0000</pubDate>
		<dc:creator>jrm</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Tests Unitaires]]></category>

		<category><![CDATA[automatisation]]></category>

		<category><![CDATA[browser]]></category>

		<category><![CDATA[navigateur]]></category>

		<category><![CDATA[tests unitaires]]></category>

		<guid isPermaLink="false">http://labs.pimsworld.org/?p=3</guid>
		<description><![CDATA[Selenium est initié par ThoughtWorks qui comprend 750 collaborateurs dans 6 pays, ce sont des pionniers de l'agilité et de l'open source. L'objectif de Selenium est de réaliser des tests fonctionnels d'application web (HTML ou XML sur HTPP) ainsi que des tests de compatibilité entre navigateurs.]]></description>
			<content:encoded><![CDATA[<h2>Selenium</h2>
<p>Selenium est initié par ThoughtWorks qui comprend 750 collaborateurs dans 6 pays, ce sont des pionniers de l&#8217;agilité et de l&#8217;open source. L&#8217;objectif de Selenium est de réaliser des tests fonctionnels d&#8217;application web (HTML ou XML sur HTPP) ainsi que des tests de compatibilité entre navigateurs.</p>
<p>Selenium est open source (license Apache 2.0), c&#8217;est un project actif bien documenté (forum, wiki). Il est décomposé en trois modules :</p>
<ul>
<li>Selenium core</li>
<li>Selenium remote control</li>
<li>Selenium IDE, plugin Firefox<span id="more-3"></span></li>
</ul>
<h3>Selenium core</h3>
<p>Moteur en Javascript/HTML, les test s&#8217;exécutent directement dans le navigateur, le tout est compatible avec Firefox, IE, Opera et Safari. L&#8217;interface d&#8217;administration permet la visualisation des scénarii, l&#8217;exécution des tests, de débugger (à l&#8217;aide de breakpoint), d&#8217;afficher des logs ainsi que l&#8217;arbre DOM de la page testée.</p>
<p>Il permet l&#8217;exécution d&#8217;actions comme cliquer, saisir du texte, vérifier le contenu d&#8217;une page à l&#8217;aide d&#8217;assertions. Le scénarii est écrit en &#8220;Selenese&#8221; qui a une syntaxe très simple : tableau HTML à 3  colonnes (commande + 2 arguments).</p>
<p>Exemple :</p>
<table style="height: 103px;" border="0" width="305">
<thead>
<tr>
<td colspan="3">JrMLab test</td>
</tr>
</thead>
<tbody>
<tr>
<td>open</td>
<td>/</td>
<td></td>
</tr>
<tr>
<td>type</td>
<td>q</td>
<td>jrmlab</td>
</tr>
<tr>
<td>clickAndWait</td>
<td>btnG</td>
<td></td>
</tr>
<tr>
<td>verifyTextPresent</td>
<td>Test - Php - JrM` Lab</td>
<td></td>
</tr>
</tbody>
</table>
<p>Selenium Core permet de faire tout ce que peut faire l&#8217;utilisateur :</p>
<ul>
<li>Presser/relâcher une touche, saisir du texte</li>
<li>Simple/double clic de la souris</li>
<li>Drag &amp; drop</li>
<li>Mouvement de la souris</li>
<li>Sélectionner une pop up ou une frame</li>
<li>Édition/suppression de cookies</li>
</ul>
<p>Il possède aussi une notion d&#8217;attente d&#8217;événement avec gestion d&#8217;un timeout.</p>
<p>Les inconvénients de Selenium Core :</p>
<ul>
<li>Cross-Site Scripting (XSS)
<ul>
<li>Selenium (HTML + JS) doit être déployé sur le même serveur que l&#8217;application testée.</li>
</ul>
</li>
<li>Les navigateurs doivent être correctement configurés
<ul>
<li>Profil potentiellement différent avant chaque exécution de test</li>
<li>Cookies existants</li>
<li>Mots de passe ou données de formulaires sauvegardés</li>
</ul>
</li>
<li>Difficile à automatiser
<ul>
<li>Lancement du navigateur</li>
<li>Rapport d&#8217;exécution non exportable</li>
</ul>
</li>
</ul>
<h3>Selenium Remote Control</h3>
<p>Selenium RC est une application JAVA 5 qui contrôle le navigateur. Il possède deux modes :</p>
<ul>
<li>automatique : lecture de scénarii au format Selenese</li>
<li>interactif : scripting des scénarii en Java, Junit, Ruby, Python, .NET, PHP</li>
</ul>
<p>Selenium RC permet de démarrer un navigateur avec un profil vierge, il n&#8217;y aucun problème de XSS en raison d&#8217;un proxy HTPP. Il est donc automatisable pour l&#8217;intégration de contenu. Les tests en Java, Ruby, PHP sont plus complets que ceux en selenese. En effet, il est plus facile de réutiliser du code et d&#8217;avoir accès à des données non présentes dans le navigateur : informations d&#8217;une base de données pour vérifier l&#8217;intégralité de certaines données, etc.</p>
<h3>Selenium IDE</h3>
<p>Selenium IDE est un plugin pour Firefox. Il permet l&#8217;enregistrement d&#8217;un scénario pouvant être exécuté dans n&#8217;importe quel autre navigateur. Il permet aussi l&#8217;exécution des tests directement dans Firefox, en effet le moteur Selenium est intégré dans le noyau de Firefox (chrome), aucun problème de Cross-Site Scripting.<br />
Selenium IDE propose aussi un debugger ainsi qu&#8217;une méthode d&#8217;exportation des tests au format Selenese, Java, Ruby, Python, .NET et PHP.</p>
<p>On se rend alors compte que Selenium IDE facilite l&#8217;automatisation d&#8217;écriture de tests simples réutilisables pour Selenium RC.</p>
<h2>Installation de Selenium</h2>
<p>Nous allons voir comment installer Selenium sous Ubuntu.</p>
<ul>
<li>Installer Apache avec PHP5 (ça nous servira pour plus tard) Reportez vous <a href="http://doc.ubuntu-fr.org/xampp" target="_blank">ici</a></li>
<li>Télécharger Selenium RC <a href="http://selenium-rc.openqa.org/download.html" target="_blank">ici</a>.</li>
<li>Dezipper l&#8217;archive dans le repertoire de votre choix le mieux étant dans /opt/selenium-rc/</li>
<li>Ouvrez un terminal et placez vous dans le repertoire où vous avez dezippé l&#8217;archive.</li>
</ul>
<p>Maintenant il ne nous reste plus qu&#8217;à tester le bon fonctionnement du serveur. Exécutez la commande suivante :</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">$ java <span class="re5">-jar</span> selenium-server.jar <span class="re5">-interactive</span></div></div>
<p>Félicitations, vous venez de lancer le serveur Selenium en mode interactif, ce qui veut dire que vous allez pouvoir directement lancer des commandes à partir de votre terminal.</p>
<p>Nous allons tester notre installation, pour ceci lancez la commande suivante :</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re2">cmd</span>=getNewBrowserSession<span class="sy0">&amp;</span>amp;<span class="nu0">1</span>=<span class="sy0">*</span>chrome <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>firefox<span class="sy0">/</span>firefox-<span class="nu0">2</span>-bin<span class="sy0">&amp;</span>amp;<span class="nu0">2</span>=http:<span class="sy0">//</span>www.google.com</div></div>
<p>Firefox s&#8217;ouvre et laisse apparaître le debugger de Selenium. Vous devriez logiquement avoir le résultat suivant dans votre terminal (avec un n° de session différent) :</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace">Got result: OK,7b3a771be605421fb0be772c7bed6e8f on session 7b3a771be605421fb0be772c7bed6e8f</div></div>
<p>Nous venons de récupérer le n° de session généré par Firefox, nous allons maintenant lancer une commande permettant d&#8217;atteindre la home de Google :</p>
<div class="codecolorer-container bash " style="overflow:auto;white-space:nowrap;width:540px"><div class="bash codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="re2">cmd</span>=open<span class="sy0">&amp;</span>amp;<span class="nu0">1</span>=http:<span class="sy0">//</span>www.google.com<span class="sy0">&amp;</span>amp;<span class="re2">sessionId</span>=7b3a771be605421fb0be772c7bed6e8f</div></div>
<p>Félicitations vous venez de lancer votre première commande Selenium &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.pimsworld.org/2008/12/installation-de-selenium-rc-sous-ubuntu/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
