<?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</title>
	<atom:link href="http://www.pmsipilot.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pmsipilot.org</link>
	<description>Blog du service technique de PMSIpilot</description>
	<lastBuildDate>Tue, 27 Jul 2010 15:13:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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 [...]]]></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>3</slash:comments>
		</item>
		<item>
		<title>Les travaux se terminent</title>
		<link>http://www.pmsipilot.org/2010/06/10/les-travaux-se-terminent/</link>
		<comments>http://www.pmsipilot.org/2010/06/10/les-travaux-se-terminent/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 09:43:02 +0000</pubDate>
		<dc:creator>Philippe Ho</dc:creator>
				<category><![CDATA[PMSIpilot (meet the team)]]></category>
		<category><![CDATA[locaux]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=392</guid>
		<description><![CDATA[




Plus de photos sur Flickr
]]></description>
			<content:encoded><![CDATA[<div id="attachment_389" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687786416_914e04d07e_b.jpg"><img class="size-medium wp-image-389 " src="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687786416_914e04d07e_b-300x225.jpg" alt="4687786416_914e04d07e_b" width="300" height="225" /></a><p class="wp-caption-text">La rue de Sully va retrouver son calme, les locaux occupent dorénavant 10 fenêtres de large </p></div>
<p style="text-align: center">
<div id="attachment_387" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687160833_8bba38f4cf_b.jpg"><img class="size-medium wp-image-387 " src="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687160833_8bba38f4cf_b-300x225.jpg" alt="4687160833_8bba38f4cf_b" width="300" height="225" /></a><p class="wp-caption-text">Un dernier coup de peinture à la charte de notre suite logicielle</p></div>
<p style="text-align: center">
<div id="attachment_388" class="wp-caption aligncenter" style="width: 235px"><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687163245_96e77c66f2_b.jpg"><img class="size-medium wp-image-388 " src="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687163245_96e77c66f2_b-225x300.jpg" alt="4687163245_96e77c66f2_b" width="225" height="300" /></a><p class="wp-caption-text">exposer les équipes de développement en plein soleil ? En voilà une idée étrange.</p></div>
<p style="text-align: center">
<div id="attachment_390" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687791150_2ed14fa7d2_b.jpg"><img class="size-medium wp-image-390 " src="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687791150_2ed14fa7d2_b-300x225.jpg" alt="4687791150_2ed14fa7d2_b" width="300" height="225" /></a><p class="wp-caption-text">Les chaises ergonomiques ont été déballées</p></div>
<p style="text-align: center">
<div id="attachment_391" class="wp-caption aligncenter" style="width: 235px"><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687798280_5ca9bcc447_b.jpg"><img class="size-medium wp-image-391 " src="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687798280_5ca9bcc447_b-225x300.jpg" alt="4687798280_5ca9bcc447_b" width="225" height="300" /></a><p class="wp-caption-text">notre équipe support cable les baies</p></div>
<p style="text-align: center">
<div id="attachment_386" class="wp-caption aligncenter" style="width: 235px"><a href="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687155161_6fce6791af_b.jpg"><img class="size-medium wp-image-386 " src="http://www.pmsipilot.org/wp-content/uploads/2010/06/4687155161_6fce6791af_b-225x300.jpg" alt="4687155161_6fce6791af_b" width="225" height="300" /></a><p class="wp-caption-text">Tout va être fin prêt pour mettre le cap sur de nouveaux défis pour la team PMSIPilot</p></div>
<p>Plus de photos sur <a href="http://www.flickr.com/photos/pmsipilot/collections/72157624147909433/">Flickr</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/06/10/les-travaux-se-terminent/feed/</wfw:commentRss>
		<slash:comments>6</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>Geoffrey</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>1</slash:comments>
		</item>
		<item>
		<title>A la découverte de la SPL: SplFileObject</title>
		<link>http://www.pmsipilot.org/2010/05/06/a-la-decouverte-de-la-spl-splfileobject/</link>
		<comments>http://www.pmsipilot.org/2010/05/06/a-la-decouverte-de-la-spl-splfileobject/#comments</comments>
		<pubDate>Thu, 06 May 2010 13:55:49 +0000</pubDate>
		<dc:creator>Geoffrey</dc:creator>
				<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[csv]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[spl]]></category>
		<category><![CDATA[splfileobject]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=340</guid>
		<description><![CDATA[La SPL, ou Standard PHP Library, est un ensemble de classes disponibles dans PHP qui regroupe bon nombre de fonctionnalités fort utiles, mais souvent méconnues. Prenons par exemple aujourd&#8217;hui SplFileObject. Cette classe facilite l&#8217;itération sur le contenu d&#8217;un fichier en mettant à notre disposition un&#8230; itérateur (dingue ça).

Exemple: disons qu&#8217;on a un fichier /tmp/foobar.csv avec [...]]]></description>
			<content:encoded><![CDATA[<p>La <a href="http://php.net/spl">SPL</a>, ou Standard PHP Library, est un ensemble de classes disponibles dans PHP qui regroupe bon nombre de fonctionnalités fort utiles, mais souvent méconnues. Prenons par exemple aujourd&#8217;hui <a href="http://php.net/splfileobject">SplFileObject</a>. Cette classe facilite l&#8217;itération sur le contenu d&#8217;un fichier en mettant à notre disposition un&#8230; itérateur (dingue ça).</p>
<p><span id="more-340"></span></p>
<p>Exemple: disons qu&#8217;on a un fichier /tmp/foobar.csv avec le contenu suivant:</p>
<pre>foo;bar
baz;quux</pre>
<p>Nous pouvons simplement parcourir les lignes avec le code suivant:</p>
<pre>&lt;?php

$file = new SplFileObject('/tmp/foobar.csv');

foreach($file as $line)
{
  $data = explode(';', $line);
}</pre>
<p>C&#8217;est pas mal non ?</p>
<p>On pourra arguer qu&#8217;on arrive au même genre de résultat en utilisant <a href="http://php.net/file">file</a>, mais l&#8217;empreinte mémoire est loin d&#8217;être la même (sans compter l&#8217;approche object de SplFileObject qui va nous permettre plus tard de faire des trucs rigolos).</p>
<p>Mais il y a encore mieux. SplFileObject gère le format CSV, de deux manières différentes. Vous pouvez au choix utiliser SplFileObject#fgetcsv ou bien (pour garder une API cohérente) expliquer à SplFileObject que le fichier que vous traitez est un CSV.</p>
<p>Attardons nous sur cette dernière méthode (toujours avec le même /tmp/foobar.csv):</p>
<pre>&lt;?php

$file = new SplFileObject('/tmp/foobar.csv');
$file-&gt;setFlags(SplFileObject::READ_CSV);
$file-&gt;setCsvControl(';');

foreach($file as $data)
{
  var_dump($data);
}</pre>
<p>Magique !</p>
<p>Vous pouvez bien évidemment (comme on le disait plus haut) surclasser SplFileObject pour lui ajouter tout un tas de trucs rigolos (par exemple chez nous on détecte les BOM, et on configure automatiquement les fichiers CSV).</p>
<p>Bien sur, SplFileObject permet bien d&#8217;autres choses, quasiment tout ce que vous pouvez faire avec les fonctions utilisant un handler fopen est disponible (à quelques exceptions près, comme par exemple fread) (globalement c&#8217;est assez orienté lecture ligne par ligne).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/05/06/a-la-decouverte-de-la-spl-splfileobject/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une blague tout les 2000</title>
		<link>http://www.pmsipilot.org/2010/05/05/une-blague-tout-les-2000/</link>
		<comments>http://www.pmsipilot.org/2010/05/05/une-blague-tout-les-2000/#comments</comments>
		<pubDate>Wed, 05 May 2010 16:33:45 +0000</pubDate>
		<dc:creator>Olivier Mansour</dc:creator>
				<category><![CDATA[PMSIpilot (meet the team)]]></category>
		<category><![CDATA[lol]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=345</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="#7000" src="http://cdn.cloudfiles.mosso.com/c54102/x2_1446c3e" alt="" width="467" height="548" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/05/05/une-blague-tout-les-2000/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony chez PMSIpilot</title>
		<link>http://www.pmsipilot.org/2010/04/23/symfony-chez-pmsipilot/</link>
		<comments>http://www.pmsipilot.org/2010/04/23/symfony-chez-pmsipilot/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 14:35:22 +0000</pubDate>
		<dc:creator>Olivier Mansour</dc:creator>
				<category><![CDATA[PMSIpilot (meet the team)]]></category>
		<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=282</guid>
		<description><![CDATA[PMSIpilot conçoit et réalise une suite informatique dédiée à l&#8217;amélioration de la gouvernance des hopitaux publics. Le périmètre fonctionnel peut s&#8217;apparenter à un outil décisionnel ou de Business Intelligence concernant l&#8217;activité, d&#8217;un point de vue financier et médical, de l&#8217;hôpital.
Il y a deux ans, le projet a connu un virage technologique important. D&#8217;une technologie obsolète [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="background-color: #fff; border-color: #fff;" title="logo symfony" src="http://www.symfony-project.org/downloads/logos/symfony.gif" alt="" width="314" height="85" /><a href="http://www.pmsipilot.com">PMSIpilot</a> conçoit et réalise une suite informatique dédiée à l&#8217;amélioration de la gouvernance des hopitaux publics. Le périmètre fonctionnel peut s&#8217;apparenter à un outil décisionnel ou de <em>Business Intelligence</em> concernant l&#8217;activité, d&#8217;un point de vue financier et médical, de l&#8217;hôpital.</p>
<p>Il y a deux ans, le projet a connu un virage technologique important. D&#8217;une technologie obsolète et d&#8217;un conception un peu hasardeuse (PHP4, framesets, &#8230;), un projet de refonte vers symfony 1.2 a été lancé. Cette refonte a durée un peu plus de 20 mois / homme et a abouti à un seul projet symfony contenant plusieurs applications. PMSIpilot a, dès le début, pris le parti d&#8217;utiliser les conventions de symfony et le paradigme MVC.</p>
<h2>En chiffres, aujourd&#8217;hui</h2>
<ul>
<li>12 développeurs (en constante augmentation !),</li>
<li>410 déploiements,</li>
<li>environ 50 000 utilisateurs répartis sur toutes ces instances,</li>
<li>environ 220 000 lignes de code PHP écrites et maintenues,</li>
<li>la prochaine release importante intégrera symfony 1.4.</li>
</ul>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/04/lines_of_code-1.png"><img class="aligncenter size-medium wp-image-310" title="lines of code" src="http://www.pmsipilot.org/wp-content/uploads/2010/04/lines_of_code-1-300x218.png" alt="lines of code" width="300" height="218" /></a></p>
<h2>Comment symfony nous aide</h2>
<h3>La documentation et la communauté</h3>
<p>La documentation de symfony nous permet d&#8217;intégrer rapidement une nouvelle recrue. Le fait de trouver de nombreuses contributions au framework (sur <a href="http://www.symfony-project.org/">symfony-project.org</a> ou bien ailleurs) est très facilitant également. Nous utilisons de nombreux plugins comme :</p>
<ul>
<li>sfPropelPlugin</li>
<li>dwJpGraphPlugin</li>
<li>sfDB4toPropelPlugin</li>
<li>sfPropelSqlDiffPlugin</li>
<li>sfJqueryReloadedPlugin</li>
<li>sfValidatorHtmlPlugin</li>
<li>sfJobQueuePlugin</li>
<li>sfFormExtraPlugin</li>
<li>&#8230;</li>
</ul>
<p>Parfois tels quels, parfois un peu modifiés pour nos besoins.</p>
<h3>Le développement</h3>
<ul>
<li>le framework nous donne une bonne structure de base pour l&#8217;organisation du code source ainsi que des normes de codage, sur une équipe aussi importante cela permet de gagner du temps,</li>
<li>mis à part i18n et l&#8217;<em>admin générator</em>, on utilise la quasi totalité de la <em>stack</em> de symfony : MVC, le cache, les filtres, les évènements, le système de gestion des utilisateur, l&#8217;ORM, les tasks, &#8230;</li>
<li>symfony est suffisament flexible pour que nous puissions facilement l&#8217;adapter à nos besoins parfois bien spécifiques ; aujourd&#8217;hui nous avons étendu : sessionStorage, viewCacheManager, ApplicationConfiguration et ProjectConfiguration, sfAction, sfComponent, sfView, frontWebController, plein de choses autour de propel &#8230;</li>
<li>nous ajoutons des fonctionnalités tous les jours, et une grande réactivité nous est demandé pour suivre l&#8217;évolution de la réglementation ; le framework de test nous permet de garantir aucune régression et de livrer des correctifs très rapidement si nécessaire (voir plus bas),</li>
<li>le système de task, de gestions des fixtures, d&#8217;environnement de développement permet de proposer des méthodes faciles d&#8217;accès au développeur permettant d&#8217;instancier un environnement de dev complet et identique à ses collègues.</li>
</ul>
<h3>L&#8217;intégration continue</h3>
<p>Dès la refonte du projet, sécuriser ces mises à jours a été une priorité. C&#8217;est pourquoi nous avons investi dans le développements d&#8217;un grand nombre de tests fonctionnels et leur suivi au sein d&#8217;une instance <a title="Le projet Hudson" href="https://hudson.dev.java.net/">Hudson</a>.<br />
<a href="http://www.pmsipilot.org/wp-content/uploads/2010/04/Capture-6.7-Hudson-Google-Chrome.png"><img class="aligncenter size-medium wp-image-292" title="Hudson" src="http://www.pmsipilot.org/wp-content/uploads/2010/04/Capture-6.7-Hudson-Google-Chrome-300x242.png" alt="Hudson" width="300" height="242" /></a><br />
Les tests fonctionnels chez PMSIpilot vérifient des cas d&#8217;utilisation standards mais sont surtout utilisés pour valider la totalité des données chiffrées présentées. A ce titre les quelques <strong>250 000 tests fonctionnels</strong> sont majoritairement générés (on ne teste pas vraiment &laquo;&nbsp;les tests&nbsp;&raquo; mais &laquo;&nbsp;les étalons des tests&nbsp;&raquo;).</p>
<p>La création de nouvelles classes a entrainé l&#8217;écriture d&#8217;<strong>une centaine de tests unitaires </strong>(avec des efforts pour optimiser la couverture du code).</p>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/04/emma.png"><img class="aligncenter size-medium wp-image-304" title="emma code coverage" src="http://www.pmsipilot.org/wp-content/uploads/2010/04/emma-300x243.png" alt="emma code coverage" width="300" height="243" /></a></p>
<p>Enfin, nous avons commencé l&#8217;écriture de <strong>tests d&#8217;interface</strong> avec Selenium (une dizaine aujourd&#8217;hui) afin de gérer plus facilement les différents navigateurs (parfois un peu datés) de nos clients. (oui, ça n&#8217;a rien à voir avec symfony &#8230;)</p>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/04/image.png"><img class="aligncenter size-medium wp-image-306" title="navigateurs" src="http://www.pmsipilot.org/wp-content/uploads/2010/04/image-300x159.png" alt="navigateurs" width="300" height="159" /></a></p>
<p><a href="http://www.pmsipilot.org/wp-content/uploads/2010/04/selenium.png"><img class="aligncenter size-medium wp-image-312" title="tests selenium" src="http://www.pmsipilot.org/wp-content/uploads/2010/04/selenium-300x187.png" alt="tests selenium" width="300" height="187" /></a></p>
<p>Pour boucler la boucle on a, en projet, l&#8217;intégration automatique de tests de montée en charge. (un outil à suggérer ?)</p>
<h2>Comment nous tentons d&#8217;aider symfony</h2>
<p>Dans la mesure du possible, nous tentons de faire <a title="nos contributions à Symfony" href="http://links.pmsipilot.com/sfcontrib">bénéficier la communauté symfony de nos travaux</a>, en remontant des bugs et en proposant des plugins . Nous essayons également de <a title="Les réunions techniques" href="http://www.pmsipilot.org/?s=r%C3%A9union+technique">partager les slides des réunions</a> techniques organisées au sein de l&#8217;équipe afin de diffuser les compétences au sein des équipes.</p>
<p>Chez PMSIpilot, on aime symfony. Si c&#8217;est votre cas aussi, n&#8217;hésitez pas à<a href="http://www.glagla.org/weblog/2009/01/07/pmsipilot-recrute-sur-lyon-des-developpeurs-symfony/"> proposer votre candidature</a> au service technique.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/04/23/symfony-chez-pmsipilot/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>Contributions à Symfony</title>
		<link>http://www.pmsipilot.org/2010/03/25/contributions-a-symfony/</link>
		<comments>http://www.pmsipilot.org/2010/03/25/contributions-a-symfony/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 13:30:01 +0000</pubDate>
		<dc:creator>Olivier Mansour</dc:creator>
				<category><![CDATA[développement informatique]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sf_contrib]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://localhost/pmsipilotorg/?p=5</guid>
		<description><![CDATA[So far, voici la liste de nos très modestes contribution à Symfony, le framework PHP utilisé chez nous :
tickets :

#1776 (fixed) [PATCH] checkbox arrays not checked with fillin enabled
#2916 (wontfix) Bug in Spyc : losing data with successive load/dump
#3792 (fixed) i18n XLIFF do not handle entities correctly
#4306 (wontfix) sfDebugConnection does not handle correctly logging of [...]]]></description>
			<content:encoded><![CDATA[<p>So far, voici la liste de nos très modestes contribution à <a href="http://www.symfony-project.org/">Symfony</a>, le framework PHP utilisé chez nous :</p>
<p>tickets :</p>
<ul>
<li><a href="http://trac.symfony-project.org/ticket/1776">#1776</a> (fixed) [PATCH] checkbox arrays not checked with fillin enabled</li>
<li><a href="http://trac.symfony-project.org/ticket/2916">#2916</a> (wontfix) Bug in Spyc : losing data with successive load/dump</li>
<li><a href="http://trac.symfony-project.org/ticket/3792">#3792</a> (fixed) i18n XLIFF do not handle entities correctly</li>
<li><a href=" http://trac.symfony-project.org/ticket/4306">#4306</a> (wontfix) sfDebugConnection does not handle correctly logging of nested transactions</li>
<li><a href="http://trac.symfony-project.org/ticket/4620">#4620</a> (fixed) [PATCH] &#8211; PHP5NestedSetBuilder generate a require to lib/model/om/Basesometing</li>
<li><a href="http://trac.symfony-project.org/ticket/5374">#5374</a> (fixed) Changeset [14122] breaks config parsing</li>
<li><a href="http://trac.symfony-project.org/ticket/5402">#5402</a> (fixed) sf doc refer to the getDispatcher() method but it doesnt exist</li>
<li><a href="http://trac.symfony-project.org/ticket/5964">#5964</a> (fixed) Notice sur sfTestBrowser</li>
<li><a href="http://trac.symfony-project.org/ticket/7446">#7446</a> (fixed) sfOutputEscaper::unescape($vars) appelé systématiquement dans _call_component</li>
<li><a href="http://trac.symfony-project.org/ticket/6639">#6639</a> (fixed) Option passed to a widget schema do not get passed through to an sfWidgetFormChoice&#8217;s renderer</li>
<li><a href="http://trac.symfony-project.org/ticket/8365">#8365</a> (opened) sfFinder not_name does not works if results intersects due to #6589</li>
<li><a href="http://trac.symfony-project.org/ticket/8384">#8384</a> (opened) sfPropelPluginConfiguration::filterAutoloadConfig should exclude vendor dir just like in the plugin autoload file</li>
<li><a href="http://trac.symfony-project.org/ticket/8402">#8402</a> (opened) sfPropelBaseTask should add propel include path by using sf_propel_runtime_path</li>
<li><a href="http://trac.symfony-project.org/ticket/8457">#8457</a> (fixed) sort the parameters in order to compute the cache key the same way when parameters are submited in different order</li>
</ul>
<p>plugins :</p>
<ul>
<li><a href="http://www.symfony-project.org/plugins/omCredentialsMapPlugin">omCredentialsMapPlugin</a> : This plugin allows you to check  all the credentials in your project and detect action not or badly securised</li>
<li><a href="http://www.symfony-project.org/plugins/omCrossAppUrlPlugin">omCrossAppUrlPlugin</a> : Simple helper to get cross app urls</li>
<li><a href="http://www.symfony-project.org/plugins/elXHProfPlugin">elXHProfPlugin</a> : Integration of XHProf profiler (simple API to profile + web debug toolbar integration)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/03/25/contributions-a-symfony/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PMSIpilot adhère à l&#8217;APRIL</title>
		<link>http://www.pmsipilot.org/2010/03/09/pmsipilot-adhere-a-lapril/</link>
		<comments>http://www.pmsipilot.org/2010/03/09/pmsipilot-adhere-a-lapril/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 11:02:39 +0000</pubDate>
		<dc:creator>Olivier Mansour</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[april]]></category>

		<guid isPermaLink="false">http://www.pmsipilot.org/?p=253</guid>
		<description><![CDATA[PMSIpilot adhère à l&#8217;APRIL. Les logiciels libres sont au coeur de notre activité. Que ce soit en interne, sur nos postes clients ou nos serveurs, ou dans les solutions packagées fournies à nos nombreux clients.


]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.april.org/association/personnes-morales.html">PMSIpilot adhère à l&#8217;APRIL</a>. Les logiciels libres sont au coeur de notre activité. Que ce soit en interne, sur nos postes clients ou nos serveurs, ou dans les solutions packagées fournies à nos nombreux clients.</p>
<p><a href='http://www.april.org/'><br />
<img src='http://www.april.org/images/logo/logo-april.png' alt='April - Promouvoir et soutenir le logiciel libre'/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pmsipilot.org/2010/03/09/pmsipilot-adhere-a-lapril/feed/</wfw:commentRss>
		<slash:comments>2</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>Olivier Mansour</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>
