<?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>Amicalement Web - Astuces et Bons plans dans le développement web &#187; tests</title>
	<atom:link href="http://www.amicalement-web.net/tag/tests/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.amicalement-web.net</link>
	<description>Astuces et bons plans d&#039;un web developpeur</description>
	<lastBuildDate>Wed, 04 Jan 2012 14:54:26 +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>Symfony et les tests</title>
		<link>http://www.amicalement-web.net/symfony-et-les-tests/2009/10/13/</link>
		<comments>http://www.amicalement-web.net/symfony-et-les-tests/2009/10/13/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 09:00:41 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=840</guid>
		<description><![CDATA[On entend partout que les tests unitaires sont indispensables, que si tu n&#8217;en fais pas c&#8217;est que tu es sale, voire même que tu codes sous Windows avec Wordpad (quoi il n&#8217;y a pas de rapport ?). Si vous aussi vous faites partie des gens qui sont persuadés que oui c&#8217;est bien (sinon je peux [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-877" src="http://www.amicalement-web.net/wp-content/uploads/Capture-d’écran-2009-10-12-à-17.17.12.png" alt="Capture d’écran 2009-10-12 à 17.17.12" width="614" height="100" /><br />
On entend partout que les tests unitaires sont indispensables, que si tu n&#8217;en fais pas c&#8217;est que tu es sale, voire même que tu codes sous Windows avec Wordpad (quoi il n&#8217;y a pas de rapport ?). Si vous aussi vous faites partie des gens qui sont persuadés que oui c&#8217;est bien (sinon je peux plus rien pour vous), mais je vois vraiment pas comment faire et par où commencer avec mon code, peut être que je vais pouvoir vous éclairer.<br />
<span id="more-840"></span><br />
Commencez par aller faire un tour sur le site de symfony pour lire la partie sur les <a  href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/08">tests unitaires dans Jobeet</a> ou dans<a  href="http://www.symfony-project.org/book/1_2/15-Unit-and-Functional-Testing"> le livre de référence</a> si ce n&#8217;est pas encore fait, et lisez ce qui suit !</p>
<h3>Le modèle MVC</h3>
<p>Le fameux Modèle Vue Controlleur. Si vous vous dites qu&#8217;à part avec un test fonctionnel (c&#8217;est à dire un test qui simule le comportement utilisateur via des clicks, avec un sfBrowser ou <a  href="http://seleniumhq.org/" target="_blank">Selenium</a>) ça va pas être possible de tester votre appli, c&#8217;est surement vrai ; que les tests fonctionnels ça se fait vers la fin de l&#8217;écriture de votre module, quand votre code HTML bouge plus trop c&#8217;est vrai aussi ; et que donc dans le coup vous voyez pas trop comment tester votre application avant de l&#8217;avoir finie, c&#8217;est vrai aussi.</p>
<h3>Du M dans le C</h3>
<p>Mais si vous vous dites tout ça, c&#8217;est qu&#8217;il y a du M dans le C. C&#8217;est à dire qu&#8217;il y a des parties de votre Modèle dans votre Controlleur et dans le coup, vous ne pouvez tester votre modèle sans votre Controlleur (et dans le coup sans la Vue aussi). C&#8217;est typiquement le cas quand vous faites quelque chose comme ça :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$objects</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Objects'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">createQuery</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'o'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'o.titi=?'</span><span style="color: #339933;">,</span><span style="color: #000088;">$titi</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">andWhere</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'...'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">orderBy</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'...'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Faites pas style c&#8217;est pas vous, je vous ai vu. Pourquoi ne pas faire ça dans l&#8217;action :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeIndex<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$objects</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Objects'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getObjectsByTiti</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$titi</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>et ça dans la classe ObjectTable :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getObjectsByTiti<span style="color: #009900;">&#40;</span><span style="color: #000088;">$titi</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Objects'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">createQuery</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'o'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'o.titi=?'</span><span style="color: #339933;">,</span><span style="color: #000088;">$toto</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">andWhere</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'...'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">orderBy</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'...'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vous serez d&#8217;accord avec moi que le résultat est le même mais que c&#8217;est un peu plus découplé. On pourra reparler plus tard du fait que le summum serait de retourner un tableau (le fameux <a  href="/benchmark-apache-doctrine-hydrate-object-vs-array/2009/10/08/">HYDRATE_ARRAY</a> de Doctrine passé à la requête) dans la méthode getObjectsByTiti afin de ne pas se retrouver avec quelque chose dépendant de dépendant de l&#8217;ORM dans le controlleur (ici une Doctrine_Collection), mais ce n&#8217;est pas le sujet ici ;-)</p>
<h3>Si c&#8217;est pareil, pourquoi c&#8217;est mieux alors ?</h3>
<p>Parce que je vous le dis ! Oui bon d&#8217;accord. Plusieurs avantages, vous n&#8217;avez qu&#8217;un endroit à aller voir en cas de souci de logique métier : le Modèle. Mais surtout plus vous en mettrez dans le modèle (le premier que je vois écrire du HTML dans le modèle devra coder avec Wordpad), plus vous pourrez en tester ! Et plus vous écrirez de tests unitaires pour vos modèles, plus vous serez confiant dans votre code et plus votre code sera de qualité. Vos controlleurs devraient faire environ 10 lines de code, pas plus. Essayez de vous y tenir, ça vous changera la vie (mettez ce qui concerne la sessions dans votre classe myUser par exemple).</p>
<p>Maintenant nous pourrions écrire un test unitaire du style :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$t</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ok</span><span style="color: #009900;">&#40;</span>
  <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span>Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Object'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getObjectsByTiti</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'mogito'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'-&gt; Getting object by mogito returns more than 4 objects'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ici je teste que notre méthode retourne au moins 4 objets si je lui demande un mogito.</p>
<h3>Vers la rédemption</h3>
<p>Si vous faites bien attention de ne pas avoir de M dans le C, vous pourrez coder toute votre logique applicative sans ouvrir un seul navigateur internet, et c&#8217;est même ce que vous devrez vous forcer à faire. Vous pouvez, voire même devez, faire marcher votre logique métier sans la moindre page web, juste en faisant tourner vos tests unitaires qui sont suffisants (et nécessaires) pour voir si votre code est bon et fait ce qu&#8217;il doit faire.</p>
<p>En faisant ça, vous pourrez ne vous concentrer que sur le modèle, sur le coeur de la logique métier, sans être parasité par des besoins webs (que le formulaire soit valide pour pouvoir récupérer l&#8217;objet, c&#8217;est pas le problème du modèle ça !).</p>
<p>Une fois que vous aurez les principales fonctions métier de codées dans votre modèle vous pourrez ensuite écrire vos controlleurs et pages web et à la fin les tests fonctionnels. Mais avant de faire ça, vous saurez qu&#8217;il y aura déjà une bonne partie de votre code qui sera écrit et testé.</p>
<h3>Et après ?</h3>
<p>Quand vous aurez pris l&#8217;habitude d&#8217;écrire des tests unitaires et que vous en serez devenu accrocs, vous pourrez passer au développement guidé par les tests (le TDD). Là vous écrivez avant les tests (donc en gros ce que vous attendez de votre modèle) et ensuite vous écrivez le modèle : vous serez assuré que tout votre modèle est couvert par les tests, et vous aurez écrit ce que doit faire votre modèle avant de l&#8217;avoir implémenté (c&#8217;est toujours bien de réfléchir avant de coder, sisi).</p>
<p>Quand vos tests commencerons à prendre du temps à s&#8217;exécuter, vous commencerez à vous intéresser à des outils d&#8217;intégration continue comme phpUnderControl ou Hudson, dont NiKo a récemment décrit<a  href="http://prendreuncafe.com/blog/post/2009/10/06/Simple-Continuous-Integration-of-a-Symfony-Project-using-Hudson" target="_blank"> l&#8217;intégration avec symfony</a> dans un de ses articles.</p>
<p>Pour finir, en effet ça va vous demander plus de temps de réaliser votre application web en écrivant des tests unitaires. Comme vous êtes Freelance et que le temps c&#8217;est de l&#8217;argent, vous vous dites que vous ne le ferez pas. Oui mais quand vous aurez livré et que le client reviendra 10 fois vers vous ensuite à cause de bugs, ou que vous aurez changé quelque chose qui aura tout cassé sans que vous ne vous en rendiez compte, et que ça commencera à se savoir que ce que vous faites est buggé : vous penserez fortement à une méthode qui vous permettra d&#8217;être beaucoup plus confiant dans votre code, à savoir l&#8217;écriture de tests !</p>
<p>Si vous êtes stagiaire ça marche aussi pour prendre de bonnes habitudes et ne pas vous faire taper dessus par votre supérieur, si vous êtes salarié reportez vous au cas du stagiaire ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-et-les-tests/2009/10/13/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
