<?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>technique @PMSIpilot &#187; testing</title>
	<atom:link href="http://www.pmsipilot.org/tag/testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pmsipilot.org</link>
	<description>Blog du service technique de PMSIpilot</description>
	<lastBuildDate>Fri, 20 Jan 2012 09:07:13 +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>Code coverage des tests unitaires d&#8217;un projet symfony et intégration dans Hudson CI</title>
		<link>http://www.pmsipilot.org/2010/06/16/code-coverage-des-tests-unitaires-dun-projet-symfony-et-integration-dans-hudson-ci/</link>
		<comments>http://www.pmsipilot.org/2010/06/16/code-coverage-des-tests-unitaires-dun-projet-symfony-et-integration-dans-hudson-ci/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 07:25:19 +0000</pubDate>
		<dc:creator>adrien.gallou</dc:creator>
				<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[hudson]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=405</guid>
		<description><![CDATA[Après avoir écrit quelques tests unitaires, on peut se demander si les tests écrits couvrent une partie assez importante du code de la classe testée, quelles peuvent être les classes restantes à tester ou tout simplement avoir une idée de l&#8217;étendue du projet couverte par des tests unitaires. Pour cela nous utiliseront le plugin Hudson [...]]]></description>
			<content:encoded><![CDATA[<p>Après avoir écrit quelques tests unitaires, on peut se demander si les tests écrits couvrent<br />
 une partie assez importante du code de la classe testée, quelles peuvent être les classes restantes à tester ou tout simplement avoir une idée de l&#8217;étendue du projet couverte par des tests unitaires.</p>
<p>  Pour cela nous utiliseront le plugin Hudson <a href="http://wiki.hudson-ci.org/display/HUDSON/Emma+Plugin">Emma</a> pour l&#8217;affichage dans Hudson, ainsi que le plugin symfony <a href="http://www.symfony-project.org/plugins/agEmmaCoverageReportPlugin">agEmmaCoverageReport</a> pour générer le fichier xml au format emma.<br />
  Le format &laquo;&nbsp;emma&nbsp;&raquo; est à la basée utilisé en java, plus d&#8217;infos sur le <a href="http://emma.sourceforge.net/">site</a> du projet.</p>
<p><strong>Utilisation de la tache de génération du rapport xml</strong></p>
<p><em>L&#8217;extension xdebug doit être installée (mais pas forcément activée).</em></p>
<p>Les fichiers testés sont trouvés en utilisant l&#8217;autoload, les fichiers de tests doivent être nommés de la façon suivante : <code>nomDeLaClasseTesteeTest.php</code>, par exemple le classe &laquo;&nbsp;qualifactCellFormatterEuro&nbsp;&raquo; aura pour fichier de test &laquo;&nbsp;qualifactCellFormatterEuroTest.php&nbsp;&raquo;.</p>
<p>  Voyons tout d&#8217;abord comment fonctionne la génération du fichier xml de rapport :</p>
<p>Si xdebug est activé par défaut : </p>
<p><code>./symfony ecr:report --xml=cheminOuSauverLeXml.xml</code></p>
<p>Mais sur le serveur d&#8217;intégration cela n&#8217;est probablement pas le cas, et il serait<br />
gênant d&#8217;avoir à l&#8217;activer pour les autres tests alors que qu&#8217;il est seulement utilisé pour le coverage.<br />
Pour cela on peut indiquer à la tache le chemin ou se situe l&#8217;extension xdebug (par exemple sur une Mandriva il se situe ici : &laquo;&nbsp;/usr/lib/php/extensions/xdebug.so&nbsp;&raquo;). La tâche sera alors appelée de cette façon.</p>
<p><code>./symfony ecr:report --xml=cheminOuSauverLeXml.xml --xdebug-extension-path=/usr/lib/php/extensions/xdebug.so</code></p>
<p><strong>Intégration dans Hudson CI</strong></p>
<p> Création et configuration du job </p>
<ul>
<li>Dans le menu de gauche : &laquo;&nbsp;Nouvelle Tache&nbsp;&raquo;</li>
<li>Cliquez sur &laquo;&nbsp;Construire un projet free-style&nbsp;&raquo;</li>
<li>Donnez un nom au job</li>
<li> Entrez alors l&#8217;url du dépôt</li>
<li>Après checkout nous voulons lancer les tests unitaires ainsi que la tache créant</li>
<p> le rapport de coverage, nous allons donc ajouter une étape au build. Celle ci sera de<br />
 type &laquo;&nbsp;Executer un script shell&nbsp;&raquo; </p>
<li>Dans la liste des commandes nous allons donc lancer les tests et le coverage de cette façon :</li>
<p><code>$WORKSPACE/symfony test:unit --xml=log/unit.xml<br />
$WORKSPACE/symfony ecr:report --xml=log/coverage.xml</code></p>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/executer_script.png"><img src="http://www.pmsipilot.org/wp-content/uploads/2010/06/executer_script-300x45.png" alt="executer_script" width="300" height="45" class="aligncenter size-medium wp-image-425" /></a></p>
<li>Pour les résultats des tests unitaires, cochons la case &laquo;&nbsp;Publier le rapport des résultats de tests JUnit&nbsp;&raquo; puis dans &laquo;&nbsp;XML des rapports de test&nbsp;&raquo; nous indiquons ou chercher le fichier XML en saisissant : &laquo;&nbsp;log/unit.xml&nbsp;&raquo;</li>
<li>Pour le code coverage, cochons la case &laquo;&nbsp;Record Emma coverage report&nbsp;&raquo; puis dans &laquo;&nbsp;Folders or files containing Emma XML reports&nbsp;&raquo; nous indiquons où chercher le fichier XML en saisissant : &laquo;&nbsp;log/coverage.xml&nbsp;&raquo;</li>
<li>Il faudra ensuite exécuter le job</li>
</ul>
<p> <strong>Affichage du rapport de code coverage</strong></p>
<p>Après lancement du job les résultats du code coverage apparaissent dans la section &laquo;&nbsp;Coverage Trend&nbsp;&raquo;. </p>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/graph.png"><img src="http://www.pmsipilot.org/wp-content/uploads/2010/06/graph-300x224.png" alt="graph" width="300" height="224" class="aligncenter size-medium wp-image-431" /></a></p>
<p>   Pour un détail du coverage il faut cliquer sur le graphique.</p>
<p>La couverture du code par les tests unitaire est alors présentée par package ainsi que par classe, méthode, bloc et ligne.</p>
<p>Les blocs sont tous à 0 car c&#8217;est une notion seulement utilisée en java. Une méthode ou une classe est couverte si toutes les lignes qui la contiennent sont couvertes. Ainsi certaines classes, ne contenant aucune ligne de code, ayant juste leur déclaration, seront indiquées comme couvertes à 100%.</p>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/tableau_floute.png"><img src="http://www.pmsipilot.org/wp-content/uploads/2010/06/tableau_floute-300x161.png" alt="tableau_floute" width="300" height="161" class="aligncenter size-medium wp-image-440" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/06/16/code-coverage-des-tests-unitaires-dun-projet-symfony-et-integration-dans-hudson-ci/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>De qui se moque-t&#8217;on ?</title>
		<link>http://www.pmsipilot.org/2010/06/07/de-qui-se-moque-ton/</link>
		<comments>http://www.pmsipilot.org/2010/06/07/de-qui-se-moque-ton/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 06:59:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=367</guid>
		<description><![CDATA[Derrière ce titre un peu faible, se cache un billet qui va, potentiellement, changer votre vie. Pour autant que vous écriviez des tests unitaires (mais tout le monde fait ça ici non ? en tout cas on en fait chez PMSIpilot &#8230;). En effet, je vais vous parler d&#8217;un truc génial: Mockery. Mockery, c&#8217;est un [...]]]></description>
			<content:encoded><![CDATA[<p>Derrière ce titre un peu faible, se cache un billet qui va, potentiellement, changer votre vie. Pour autant que vous écriviez des tests unitaires (mais tout le monde fait ça ici non ? en tout cas on en fait chez PMSIpilot &#8230;). En effet, je vais vous parler d&#8217;un truc génial: <a href="http://github.com/padraic/mockery">Mockery</a>. Mockery, c&#8217;est un framework de Mock (il parait qu&#8217;on dit Bouchon en français, mais c&#8217;est vraiment trop ridicule), écrit par Pádraic Brady, qui fait partie de la core team du Zend Framework. Du lourd quoi.  <span id="more-367"></span></p>
<p>Bon, mais d&#8217;abord, pour les nouveaux, qu&#8217;est-ce donc qu&#8217;un Mock ? Je ne saurais mieux l&#8217;expliquer que Padraic dans <a href="http://blog.astrumfutura.com/archives/423-PHP-Mock-Objects-Sucking-Ass-Since-Forever.html">son superbe <em>blogpost</em></a>, mais pour les pressés, on va faire une version courte. Un mock est un remplacement d&#8217;objet pour isoler un test. Par exemple, on peut créer des mocks de base de données pour éviter d&#8217;instancier tout Propel a chaque test. Voilà, ça c&#8217;est pour la théorie.</p>
<p>Toujours pas clair ? Un petit exemple alors. Tout à l&#8217;heure j&#8217;ai écris des tests (disons pour une classe qui s&#8217;appellerait Foobar). C&#8217;est une super classe, qui fait son job, pas de problème, mais qui demande en constructeur 2 objets: un <span style="font-family: courier new,monospace">Foo</span> et un <span style="font-family: courier new,monospace">Bar.</span> Disons que Foo et Bar coûtent un peu cher à instancier. J&#8217;ai donc 2 choix: instancier des vrais objets (c&#8217;est mal, mais c&#8217;est qu&#8217;on fait en général), ou utiliser des mocks (c&#8217;est bien, mais on le fait pas parcequ&#8217;on a la flemme d&#8217;écrire les mocks).  Qu&#8217;à cela ne tienne, avec Mockery, c&#8217;est fait en 2 coups de cuiler a pot:<br />
<code>$foo  = Mockery::mock('Foo', array('getCreatedAt' =&gt; date('Y-m-d H:i:s'));<br />
$bar = Mockery::mock('Bar', array(<br />
'getIsSaved' =&gt; true,<br />
'getTitle' =&gt; 'recherche titre',<br />
'getDescription' =&gt; 'recherche description',<br />
'getIsPublic'=&gt; true ));<br />
$object = new Foobar($foo, bar);<br />
</code>Donc ça c&#8217;est la forme un peu &laquo;&nbsp;rapide&nbsp;&raquo; de création de mock. Pour chaque méthode que je spécifie dans l&#8217;array d&#8217;options, mockery assigne en valeur de retour la valeur en face. Donc $recherche-&gt;getTite() renverra &laquo;&nbsp;recherche titre&nbsp;&raquo; par exemple. C&#8217;est cool non ?  Bien sur on peut aller super loin avec Mockery, comme par exemple dire &laquo;&nbsp;la méthode tartenpion de l&#8217;objet pmsipilotUser doit etre appelé avec en paramètre perlinpinpin et renvoyer un objet MerlinLenchanteur et ne doit être utilisée qu&#8217;une fois sinon la terre explose&nbsp;&raquo;:<br />
<code>$merlin = new MerlinLenchanteur();<br />
$user = Mockery::mock('pmsipilotUser');<br />
$user-&gt;shouldReceive('tartenpion')-&gt;with('perlinpinpin')-&gt;once()-&gt;andReturn($merlin);<br />
</code> (ok je triche encore un peu on ne peut pas vraiment faire exploser la terre)  Par contre si on veut vérifier que tout a bien été appelé comme on l&#8217;a défini, il ne faut pas oublier de le dire a la fin:  <code> Mockery::close(); </code>Un dernier exemple pour vous convaincre de la puissance de Mockery. On rencontre souvent du code qui viole la Loi de Demeter, et qui de fait devient difficile à tester. Point de chichi avec Mockery, car il permet aussi de Mocker une chaine d&#8217;appels complète très simplement:  <code> $mock = Mockery::mock('demeter'); $mock-&gt;shouldReceive('foo-&gt;bar-&gt;quux-&gt;roflpwn-&gt;demeter')-&gt;andReturn('omgponies'); </code> Magique non ? Pour encore plus de trucs magiques, je vous invite à lire la doc sur <a href="http://github.com/padraic/mockery">la page github de mockery</a>.  Voilà j&#8217;espère que ça vous aura donné envie d&#8217;utiliser un peu plus de Mocks dans vos tests :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/06/07/de-qui-se-moque-ton/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Réunion technique tests unitaires</title>
		<link>http://www.pmsipilot.org/2010/04/06/reunion-technique-tests-unitaires/</link>
		<comments>http://www.pmsipilot.org/2010/04/06/reunion-technique-tests-unitaires/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 06:42:31 +0000</pubDate>
		<dc:creator>adrien.gallou</dc:creator>
				<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[présentations (et autre powerpointerie)]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=273</guid>
		<description><![CDATA[Voici les slides de la dernière réunion technique ayant pour sujet les tests unitaires : Réunion technique &#8211; tests unitaires View more presentations from PMSIpilot.]]></description>
			<content:encoded><![CDATA[<p>Voici les slides de la dernière réunion technique ayant pour sujet les tests unitaires :</p>
<div id="__ss_3645638" style="width: 425px;"><strong><a title="Réunion technique - tests unitaires" href="http://www.slideshare.net/pmsipilot/runion-technique-tests-unitaires">Réunion technique &#8211; tests unitaires</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=unit-100406014610-phpapp02&amp;stripped_title=runion-technique-tests-unitaires" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=unit-100406014610-phpapp02&amp;stripped_title=runion-technique-tests-unitaires" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/pmsipilot">PMSIpilot</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/04/06/reunion-technique-tests-unitaires/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tests fonctionnels Selenium</title>
		<link>http://www.pmsipilot.org/2010/03/08/tests-fonctionnels-selenium/</link>
		<comments>http://www.pmsipilot.org/2010/03/08/tests-fonctionnels-selenium/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 13:38:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[présentations (et autre powerpointerie)]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=248</guid>
		<description><![CDATA[Les slides de la dernière réunion technique. L&#8217;occasion encore d&#8217;évoquer des sujets passionnants ;-). Au menu : le code coupling les tests unitaires (en attendant un point complet là dessus le prochain mois) les tests d&#8217;interface que je propose de réaliser avec Selenium Réunion technique PMSIpilot &#8211; Mars 2010 View more presentations from PMSIpilot.]]></description>
			<content:encoded><![CDATA[<p>Les slides de la dernière réunion technique. L&#8217;occasion encore d&#8217;évoquer des sujets passionnants ;-).</p>
<p>Au menu :</p>
<ul>
<li>le code coupling</li>
<li>les tests unitaires (en attendant un point complet là dessus le prochain mois)</li>
<li>les tests d&#8217;interface que je propose de réaliser avec Selenium</li>
</ul>
<div id="__ss_3364419" style="width: 425px;"><strong><a title="Réunion technique PMSIpilot - Mars 2010" href="http://www.slideshare.net/pmsipilot/runion-technique-pmsipilot-mars-2010">Réunion technique PMSIpilot &#8211; Mars 2010</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=reutechselenium-100308071425-phpapp01&amp;stripped_title=runion-technique-pmsipilot-mars-2010" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=reutechselenium-100308071425-phpapp01&amp;stripped_title=runion-technique-pmsipilot-mars-2010" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/pmsipilot">PMSIpilot</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/03/08/tests-fonctionnels-selenium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

