<?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>Horizon .Net &#187; TDD</title>
	<atom:link href="https://blog.developpez.com/phertzog/pcategory/developpement/tdd/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/phertzog</link>
	<description></description>
	<lastBuildDate>Sun, 11 Apr 2010 11:22:57 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Démarche TDD &#8211; Une première tentative &#8211; Partie 2</title>
		<link>https://blog.developpez.com/phertzog/p8553/developpement/demarche_tdd_une_premiere_tentative_part_2</link>
		<comments>https://blog.developpez.com/phertzog/p8553/developpement/demarche_tdd_une_premiere_tentative_part_2#comments</comments>
		<pubDate>Sun, 07 Feb 2010 14:46:50 +0000</pubDate>
		<dc:creator><![CDATA[phertzog]]></dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet est la suite de mon exploration de la démarche TDD appliquée au problème de recherche de l&#8217;équilibrium. La première partie (qui décrit aussi en quoi consiste la recherche de l&#8217;équilibrium)  peut être trouvée sur mon blog : Démarche TDD &#8211; Une première tentative Lors du dernier billet, nous en étions resté aux cas basiques. Voyons maintenant d&#8217;autres tests qui vont nous permettre d&#8217;arriver à une solution complète. Cas du tableau à 2 éléments [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce billet est la suite de mon exploration de la démarche TDD appliquée au problème de recherche de l&rsquo;équilibrium. La première partie (qui décrit aussi en quoi consiste la recherche de l&rsquo;équilibrium)  peut être trouvée sur mon blog :</p>
<p><a href="http://blog.developpez.com/phertzog/p8529/developpement/tdd/demarche-tdd-andash-une-premiere-tentati/#more8529" target="_blank">Démarche TDD &#8211; Une première tentative</a></p>
<p>Lors du dernier billet, nous en étions resté aux cas basiques. Voyons maintenant d&rsquo;autres tests qui vont nous permettre d&rsquo;arriver à une solution complète.</p>
<p><span id="more-3"></span><br />
<h3>Cas du tableau à 2 éléments</h3>
<p>Dans le cas d&rsquo;un tableau à 2 éléments, il y aura un équilibrium si et seulement si il y a au moins un des 2 éléments qui est égal à 0. Le cas ou les 2 éléments sont à 0 est particulier car il repose sur notre convention de prendre l&rsquo;équilibrium le plus petit en cas de plusieurs équilibriums. On a dons les cas suivants:</p>
<ul>
<li>i &#8211; 0 => 0 </li>
<li>0 &#8211; j => 1 </li>
<li>i &#8211; j => -1 </li>
<li>0 &#8211; 0 => 0 </li>
</ul>
<p>avec i != 0 et j != 0.</p>
<h4></h4>
<h4>Test 04</h4>
<p>Au lieu d&rsquo;écrire 4 tests séparés, nous allons utiliser une fonctionnalité des tests MS Tests qui permet de fournir un jeu de données et de réponses en entrée du test. Le test sera donc exécuté autant de fois qu&rsquo;il y a de jeux de données. Dans notre cas la source en entrée est un fichier XML. Les autres possibilités offertes sont un fichier CSV soit une base de donnée. Voici le fichier de tests (désolé pour l&rsquo;affichage, je n&rsquo;ai pas réussi à le rendre plus lisible sur le blog) :  </p>
<p> <code class="codecolorer text default"><span class="text">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;tests&gt;&lt;test&gt;&lt;name&gt;0-0&lt;/name&gt; &lt;data&gt;0,0&lt;/data&gt; &lt;expected&gt;0&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;1-0&lt;/name&gt; &lt;data&gt;1,0&lt;/data&gt; &lt;expected&gt;0&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;0-1&lt;/name&gt; &lt;data&gt;0,-1&lt;/data&gt; &lt;expected&gt;1&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;1-1&lt;/name&gt; &lt;data&gt;1,1&lt;/data&gt; &lt;expected&gt;-1&lt;/expected&gt; &lt;/test&gt;&lt;/tests&gt;</span></code><br />
<h4></h4>
<h4>Le Test</h4>
<p>Le test en lui même est assez simple    </p>
</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[DeploymentItem(<span style="color: #006080">"ProblemsTests\\Equilibrium\\TestsData\\2_Elelments_Arrays.xml"</span>), DataSource(<span style="color: #006080">"Microsoft.VisualStudio.TestTools.DataSource.XML"</span>, <span style="color: #006080">"|DataDirectory|\\2_Elelments_Arrays.xml"</span>, <span style="color: #006080">"test"</span>, DataAccessMethod.Sequential), TestMethod]       <br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_Array_With_2_Elements()<br />{<br />    <span style="color: #0000ff">string</span>[] input = TestContext.DataRow[1].ToString().Split(<span style="color: #0000ff">new</span> <span style="color: #0000ff">char</span>[]{<span style="color: #006080">','</span>});<br />    <span style="color: #0000ff">int</span>[] inputArray = Array.ConvertAll<code class="codecolorer text default"><span class="text">&lt;</span></code><span style="color: #0000ff">string</span>, <span style="color: #0000ff">int</span><code class="codecolorer text default"><span class="text">&gt;</span></code>(input, <span style="color: #0000ff">delegate</span>(<span style="color: #0000ff">string</span> s) { <span style="color: #0000ff">return</span> <span style="color: #0000ff">int</span>.Parse(s); });<br />    <span style="color: #0000ff">int</span> expected = Convert.ToInt32(TestContext.DataRow[2]);<br />    <span style="color: #0000ff">int</span> actual;<br /><br />    actual = Problems.Equilibrium.Equilibrium.FindEquilibrium(inputArray);<br /><br />    Assert.AreEqual(expected, actual,<span style="color: #006080">"Test failed for case {0}"</span>, TestContext.DataRow[0]);<br />}</pre>
<p></div>
<p>On remarque quelques nouveautés par rapport au tests précédents.</p>
<ol>
<li>Le nom de la méthode est décoré avec &laquo;&nbsp;DeploymentItem&nbsp;&raquo; qui indique ou se trouve le fichier xml source et d&rsquo;autres  paramètres. Ceci permet d&rsquo;indiquer que nous avons un test &laquo;&nbsp;dirigé par les données&nbsp;&raquo; ou &laquo;&nbsp;data driven test&nbsp;&raquo;. Pour plus de détails concernant la façon de mettre cela en place je vous renvoie au blog suivant :<br />
    <br /><a href="http://blogs.developpeur.org/azra/archive/2007/10/14/vs-2008-jeux-de-donn-es-xml-et-csv-pour-tests-unitaires.aspx" target="_blank">|VS 2008] Jeux de données XML et CSV pour tests unitaires</a> </li>
<li>Le tableau en entrée et créé à partir de la valeur du noeud &laquo;&nbsp;data&nbsp;&raquo; que nous convertissons en tableau d&rsquo;entiers grâce à &laquo;&nbsp;Array.ConvertAll&nbsp;&raquo;. </li>
<li>Le résultat attendu est lu à partir du noeud &laquo;&nbsp;expected&nbsp;&raquo;. </li>
</ol>
<p>En exécutant le test on a un échec car les cas 3 et 4 ne sont pas correct (ce qui est logique puisque notre implémentation actuelle ne retourne que la valeur 0 pour un tableau non nul. Corrigeons donc notre code?</p>
<h4></h4>
<h4>Le code</h4>
<p>Voici une première version du code qui passe tous les tests et qui est naïvement simple. </p>
<blockquote>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />{<br />    <span style="color: #0000ff">if</span> ((inputArray == <span style="color: #0000ff">null</span>) || (inputArray.Length == 0))<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />    <span style="color: #0000ff">else</span><br />    {<br />        <span style="color: #0000ff">if</span> (inputArray.Length == 1)<br />        {<br />            <span style="color: #0000ff">return</span> 0;<br />        }<br />        <span style="color: #0000ff">else</span><br />        {<br />            <span style="color: #0000ff">if</span> (inputArray[1] == 0)<br />            {<br />                <span style="color: #0000ff">return</span> 0;<br />            }<br />            <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span> (inputArray[0] == 0)<br />            {<br />                <span style="color: #0000ff">return</span> 1;<br />            }<br />            <span style="color: #0000ff">else</span><br />            {<br />                <span style="color: #0000ff">return</span> -1;<br />            }<br />        }<br />    }            <br />}</pre>
<p></div>
<p>Ce code fonctionne mais l&rsquo;imbrication de conditions donne un sentiment de code mal écrit. Tentons d&rsquo;améliorer les choses. Tant que le tableau n&rsquo;avait pas plus d&rsquo;un élément il était possible de donner le résultat en un seul test. A partir de 2 éléments, on voit qu&rsquo;il faut plusieurs tests. Il est donc temps, je pense, de réfléchir à un algorithme plus proche de la définition. Voici le résultat auquel j&rsquo;arrive :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />{<br />    <span style="color: #0000ff">if</span> (inputArray == <span style="color: #0000ff">null</span>)<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />    <span style="color: #0000ff">else</span><br />    {<br />    <br />        <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i <code class="codecolorer text default"><span class="text">&lt;</span></code> inputArray.Length; i++)<br />        {<br />            var sommeGauche = 0;<br />            <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> j = 0; j <code class="codecolorer text default"><span class="text">&lt;</span></code> i; j++)<br />            {<br />                sommeGauche += inputArray[j];<br />            }<br /><br />            var sommeDroite = 0;<br />            <span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> k = i + 1; k <code class="codecolorer text default"><span class="text">&lt;</span></code> inputArray.Length; k++)<br />            {<br />                sommeDroite += inputArray[k];<br />            }<br /><br />            <span style="color: #0000ff">if</span> (sommeGauche == sommeDroite)<br />            {<br />                <span style="color: #0000ff">return</span> i;<br />            }<br />        }<br />        <span style="color: #0000ff">return</span> -1;<br />    }           <br />}</pre>
<p></div>
<p>Nous avons implémenter le définition de l&rsquo;équilibrium presque mot pour mot. Nous parcourons les éléments du tableau et additionnons les éléments à gauche de l&rsquo;élément courant avec les éléments à droite de l&rsquo;élément courant. On remarquera ici que je n&rsquo;utilise pas une taille fixe pour le tableau mais bien la taille réelle? Ceci n&rsquo;est pas une anticipation d&rsquo;un test futur mais bien une volonté de ne pas utiliser de constante &laquo;&nbsp;magique&nbsp;&raquo; dans le code. Utiliser directement la valeur &laquo;&nbsp;2&nbsp;&raquo; aurait masqué le fait qu&rsquo;il s&rsquo;agit de la taille de mon tableau.</p>
<p>En première intention j&rsquo;avais mis le bloc implémentant l&rsquo;algorithme (c&rsquo;est à dire les 2 boucles imbriquées) le bloc &laquo;&nbsp;else&nbsp;&raquo; correspondant au cas (taille du tableau > 1). En prenant ensuite un peu de recul j&rsquo;ai remarqué que les cas tableau à 0 et 1 élément étaient également couverts par la boucle imbriquée. Je pouvais donc retirer les tests &laquo;&nbsp;inputArray.Length == 0&Prime; et &laquo;&nbsp;inputArray.Length == 1&Prime; ce qui simplifie encore le code.</p>
</blockquote>
<h3></h3>
<h3>Cas du tableau à 3 éléments</h3>
<p>L&rsquo;étape suivant consiste à traiter les tableaux à 3 éléments. Cette fois la partie ardue à consister à déterminer les cas de tests pertinents pour éviter d&rsquo;avoir à faire toutes les combinaisons possibles. J&rsquo;en suis arrivé à isoler 4 cas qui couvrent (sauf erreur de ma part) toutes les configurations pour un tableau (i,j,k) :</p>
<ol>
<li>Somme droite nulle (j+k = 0) : résultat = 0 </li>
<li>Somme droite non nulle (j+k != 0) et somme gauche nulle (i + j = 0) : résultat = 2 </li>
<li>Somme droite non nulle (j+k != 0) et somme gauche non nulle (i+j != 0) et symétrie centrale (i = k) : résultat = 1 </li>
<li>Somme droite non nulle (j+k != 0) et somme gauche non nulle (i+j != 0) et pas de symétrie centrale (i != k)  : résultat = ?1 </li>
</ol>
<p>On obtient le jeu de test suivant :</p>
<p><code class="codecolorer text default"><span class="text">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;&lt;tests&gt;&lt;test&gt;&lt;name&gt;Cas 1: somme droite nulle (j+k = 0)&lt;/name&gt; &lt;data&gt;145887,14770,-14770&lt;/data&gt; &lt;expected&gt;0&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;Cas 2: Symetrie centrale (i == k) avec somme droite non nulle (j+k != 0)&lt;/name&gt; &lt;data&gt;-54,1,-54&lt;/data&gt; &lt;expected&gt;1&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;Cas 3 somme gauche nulle (i+j = 0) et somme droite non nulle (j+k != 0)&lt;/name&gt; &lt;data&gt;-15,15,1024&lt;/data&gt; &lt;expected&gt;2&lt;/expected&gt; &lt;/test&gt;&lt;test&gt;&lt;name&gt;Cas 4: aucune symetrie (i != k), somme droite non nulle, somme gauche non nulle &lt;/name&gt;&lt;data&gt;1,2,3&lt;/data&gt; &lt;expected&gt;-1&lt;/expected&gt; &lt;/test&gt;&lt;/tests&gt;</span></code></p>
<h4>Le test</h4>
<p>Le code du test est le même que celui du test précédent. Seul le fichier source va changer.</p>
<h4>Le code</h4>
<p>Ici on constate que tous les cas passent avec succès. Le code fonctionne donc très bien sur les tableaux à 3 éléments.</p>
<h3></h3>
<h3>La suite &#8230;</h3>
<p>A partir des différents tests mené, j&rsquo;assume que les combinaisons avec des tableaux de tailles > 3 peuvent se ramener à un des cas de tableau à 3 éléments. Par exemple pour un tableau à 4 éléments (i, j, k, l) si i est l&rsquo;équilibrium, il sera aussi l&rsquo;équilibrium du tableau (i, j, k+l) ou (i, j+k, l). Et ainsi de suite. Par sécurité j&rsquo;ai tout de même rajouté un test avec un fichier contenant quelques tests de tableaux supérieurs à 3. Aucune modification de code n&rsquo;a été nécessaire. Je vous laisse essayer des cas avec le code fournis. Si vous trouvez une configuration qui n&rsquo;est pas couverte n&rsquo;hésitez pas à m&rsquo;en faire part.</p>
<p>Je considère donc qu&rsquo;il n&rsquo;est pas nécessaire de faire plus de tests pour valider le bon fonctionnement du code. Par contre il nous reste quelques tests un peu plus subtils à écrire. Nous verrons cela dans le dernier article de la série.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Démarche TDD – Une première tentative</title>
		<link>https://blog.developpez.com/phertzog/p8529/developpement/demarche_tdd_andash_une_premiere_tentati</link>
		<comments>https://blog.developpez.com/phertzog/p8529/developpement/demarche_tdd_andash_une_premiere_tentati#comments</comments>
		<pubDate>Fri, 22 Jan 2010 23:01:43 +0000</pubDate>
		<dc:creator><![CDATA[phertzog]]></dc:creator>
				<category><![CDATA[Developpement]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le but de ce premier billet est de vous faire partager mes tentatives d&#8217;application d&#8217;une démarche de développement dirigée par les tests (ou TDD) à un cas simple. Actuellement j&#8217;utilise plutôt une démarche &#171;&#160;classique&#160;&#187; : je réfléchis d&#8217;abord à mon problème dans sa globalité, je conçois et j&#8217;implémente mon algorithme et seulement ensuite je passe à la phase des tests unitaires. La démarche et le sujet Pour cet exercice je me suis forcé à appliquer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><font size="2" face="Georgia">Le but de ce premier billet est de vous faire partager mes tentatives d&rsquo;application d&rsquo;une démarche de développement dirigée par les tests (ou TDD) à un cas simple. Actuellement j&rsquo;utilise plutôt une démarche &laquo;&nbsp;classique&nbsp;&raquo; : je réfléchis d&rsquo;abord à mon problème dans sa globalité, je conçois et j&rsquo;implémente mon algorithme et seulement ensuite je passe à la phase des tests unitaires.</font></p>
<h2></h2>
<h3>La démarche et le sujet</h3>
<p><font size="2" face="Georgia">Pour cet exercice je me suis forcé à appliquer au plus prêt ce que je pense avoir saisi de la démarche TDD. C&rsquo;est à dire :</font></p>
<ol>
<li><font size="2" face="Georgia">Ecrire d&rsquo;abord un test qui échoue </font></li>
<li><font size="2" face="Georgia">Ecrire le code minimum pour faire passer le test. C&rsquo;est à dire qu&rsquo;à chaque étape il ne faut pas anticiper le code pour un test futur. </font></li>
<li><font size="2" face="Georgia">Après chaque modification faite pour passer un nouveau test, il faut prendre du recul et modifier le code afin de le rendre &laquo;&nbsp;propre&nbsp;&raquo; (ce que je traduis par faire que le code respecte les principes de développement comme le fait de supprimer les répétitions, de s&rsquo;assurer que chaque classe et méthode à bien une seule responsabilité &#8230;). </font></li>
</ol>
<p><font size="2" face="Georgia">Pour appliquer ces principe, j&rsquo;ai choisi de prendre un essai de résolution d&rsquo; un petit problème informatique assez simple et connu : la recherche de l&rsquo;é</font><font size="2" face="Georgia">quilibrium. Petit énoncé du sujet pour rappel :</font></p>
<blockquote><p><font size="2" face="Georgia">Etant donné une suite d&rsquo;entier dans un tableau, il faut trouver la position dans le tableau à partir de laquelle la somme des entiers de gauche est égale à la somme des entiers de droite (on ne compte pas la valeur de l&rsquo;élément pivot). Prenons un exemple :</font></p>
<p><font size="2" face="Georgia">Soit le tableau A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0  les équilibrium possibles sont:        <br />3 => A[0]+A[1]+A[2]=A[4]+A[5]+A[6]         <br />6 => A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0 et la somme de 0 éléments est aussi égale à 0 (il n&rsquo;y a pas d&rsquo;élément au delà de l&rsquo;indice 6). </font></p>
<p><font size="2" face="Georgia">Les bases de l&rsquo;exercice étant posée, passons au vif du sujet : la réalisation d&rsquo;une méthode qui prend en argument un tableau d&rsquo;entiers et qui </font></p>
<ul>
<li>
<p><font size="2" face="Georgia">renvoie l&rsquo;équilibrium d&rsquo;indice le plus bas s&rsquo;il existe au moins un équilibrium : le fait de retourner l&rsquo;indice de plus bas niveau est un choix purement arbitraire.</font></p>
</li>
<li>
<p><font size="2" face="Georgia">la valeur -1 si aucun équilibrium n&rsquo;est trouvé.</font> </p>
</li>
</ul>
</blockquote>
<p><span id="more-2"></span></p>
<p><font size="2" face="ge">Maintenant que le contexte est posé, passons au codage.</font></p>
<h3>Le codage</h3>
<p><font size="2" face="ge">Nous allons donc créer des tests de plus en plus évolués. A chaque étape je vais présenter le code obtenu pour passer le test.</font></p>
<h4>Cas du tableau &laquo;&nbsp;null&nbsp;&raquo;</h4>
<p><font size="2" face="ge">Ce premier cas est totalement trivial. Si on passe un tableau vide à la fonction, elle doit renvoyer -1.      <br />Ecrivons donc ce premier test à l&rsquo;aide de MS Test (inclus dans la version beta de Visual Studio 2010).</font></p>
<h5>Test 01</h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod()]<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_NullArray_NoEquilibrium()<br />        {<br />            <span style="color: #0000ff">int</span>[] inputArray = <span style="color: #0000ff">null</span>; <br />            <span style="color: #0000ff">int</span> expected = -1; <br />            <span style="color: #0000ff">int</span> actual;<br /><br />            actual = Equilibrium.FindEquilibrium(inputArray);<br />            <br />            Assert.AreEqual(expected, actual);            <br />        }</pre>
</div>
<h5>Le code</h5>
<p><font size="2" face="ge">Ecrivons maintenant le minimum de code pour faire passer ce test. Ici ma principale difficulté était de ne pas écrire trop de code en anticipant ce qui allait venir.</font>
</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Equilibrium<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />    {<br />        <span style="color: #0000ff">return</span> -1;<br />    }<br />}</pre>
</div>
<p><font size="2" face="ge">Plus simple que ça, je ne vois pas.</font></p>
<h4>Cas du tableau vide</h4>
<p><font size="2" face="ge">Cette fois ci nous allons envoyer un tableau vide à la méthode. Comme il n&rsquo;y a pas d&rsquo;indice défini, la réponse doit à nouveau être -1. Ecrivons donc le test.</font> </p>
<h5>Test 02</h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod()]<br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_EmptyArray_NoEquilibrium()<br />{<br />    <span style="color: #0000ff">int</span>[] inputArray = <span style="color: #0000ff">new</span> <span style="color: #0000ff">int</span>[] {};<br />    <span style="color: #0000ff">int</span> expected = -1;<br />    <span style="color: #0000ff">int</span> actual;<br /><br />    actual = Equilibrium.FindEquilibrium(inputArray);<br /><br />    Assert.AreEqual(expected, actual);<br />}</pre>
<p></div>
<h5>Le code</h5>
<p><font size="2" face="ge">Comme nous avons écris du code robuste <img src="https://blog.developpez.com/phertzog/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> ce test passe au la main. Il n&rsquo;y a pas besoin d&rsquo;ajouter du code à notre code précédent.</font></p>
<h4>Cas du tableau à 1 élément</h4>
<p><font size="2" face="ge">Notre prochain cas va s&rsquo;occuper de traiter un tableau contenant un seul élément. Dans ce cas, la fonction doit retourner 0. En effet à gauche et à droite de l&rsquo;unique élément il n&rsquo;y a rien => somme de 0 de chaque coté. On remarquera au passage que le valeur stockée dans le tableau n&rsquo;a pas d&rsquo;importance.</font></p>
<h5>Test 03 </h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">[TestMethod]        <br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Simple_Array_1_Return_0()<br />{<br />    <span style="color: #008000">//La valeur réelle de l'élément n'a aucune importance dans ce cas</span><br />    <span style="color: #0000ff">int</span>[] inputArray = <span style="color: #0000ff">new</span> <span style="color: #0000ff">int</span>[1] { 1 };<br />    <span style="color: #0000ff">int</span> expected = 0;<br />    <span style="color: #0000ff">int</span> actual;<br /><br />    actual = Equilibrium.FindEquilibrium(inputArray);<br /><br />    Assert.AreEqual(expected, actual); <br />}</pre>
<p></div>
<p><font size="2"><u>Remarque</u> : je n&rsquo;ai pas voulu mettre un nombre aléatoire dans le tableau car je pense que chaque exécution d&rsquo;un test doit se comporter de la même manière. Un élément aléatoire risquerait d&rsquo;introduire un comportement dans lequel le test échouerait de manière non prédictive, ce qui nuit à la confiance accordée aux tests. J&rsquo;ai donc préféré ajouter un commentaire expliquant que le choix de la valeur 1 n&rsquo;a pas d&rsquo;importance dans notre cas.</font></p>
<p><font size="2">Cette fois ci notre implémentation ne passe pas le test 03. Il faut donc modifier le code.</font></p>
<h5>Le code</h5>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Equilibrium<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">int</span> FindEquilibrium(<span style="color: #0000ff">int</span>[] inputArray)<br />    {<br />        <span style="color: #0000ff">if</span> ((inputArray == <span style="color: #0000ff">null</span>) || (inputArray.Length == 0))<br />        {<br />            <span style="color: #0000ff">return</span> -1;<br />        }<br />        <span style="color: #0000ff">else</span><br />        {<br />            <span style="color: #0000ff">return</span> 0;<br />        }            <br />    }<br />}</pre>
<p></div>
<p><font size="2" face="ge">Nous avons regroupé les cas qui doivent renvoyer -1 et ajouter un else qui retourne 0. Même si nous savons que cette solution est imparfaite, elle convient cependant à tous nos tests et c&rsquo;est ce que nous gardons à ce stade.</font></p>
<h4>Et la suite &#8230;</h4>
<p><font size="2" face="ge">Pour l&rsquo;instant nous avons couvert les cas simple. Le prochain billet couvrira de nouveau cas. En attendant ce billet je te laisse, cher lecteur, réfléchir aux tests à rajouter. Tu pourras ainsi également comparer le résultat auquel tu seras arrivé avec mon résultat.</font></p>
<p><font size="2" face="ge">PS : Ceci est mon premier billet, merci de faire preuve d&rsquo;un peu d&rsquo;indulgence. Par contre les critiques constructives sur le fond ou la forme sont les bienvenues.</font></p>
<p><font size="2" face="ge">A bientôt</font></p>
<blockquote>
<p><font size="2" face="ge">Live long and prosper</font></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
