<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://batswirl.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Batswirl : TDD</title><link>http://batswirl.com/blogs/batswirl_fr/archive/tags/TDD/default.aspx</link><description>Tags: TDD</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>Scrum.org la révolution des développeurs</title><link>http://batswirl.com/blogs/batswirl_fr/archive/2010/04/26/scrum-org-la-r-volution-des-d-veloppeurs.aspx</link><pubDate>Mon, 26 Apr 2010 14:44:00 GMT</pubDate><guid isPermaLink="false">bf5799a0-ebdd-4960-adab-bab5df34bb7d:60</guid><dc:creator>batswirl</dc:creator><slash:comments>1</slash:comments><comments>http://batswirl.com/blogs/batswirl_fr/comments/60.aspx</comments><wfw:commentRss>http://batswirl.com/blogs/batswirl_fr/commentrss.aspx?PostID=60</wfw:commentRss><description>&lt;p&gt;&lt;a target="_blank" href="http://scrum.org/"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="scrumdotorg" border="0" alt="scrumdotorg" width="244" height="50" src="http://batswirl.com/blogs/batswirl_fr/scrumdotorg_12D81F5F.jpg"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Si vous ne connaissez pas encore &lt;a target="_blank" href="http://www.scrum.org"&gt;Scrum.org&lt;/a&gt; et que vous travaillez actuellement dans un contexte agile, je vous conseille fortement de faire une petite visite sur le site.&lt;/p&gt;  &lt;p&gt;   &lt;br&gt;Il s'agit d'une nouvelle initiative visant à promouvoir Scrum et l'agilité et à former les acteurs d'un projet à ces nouveaux contextes.&lt;/p&gt;  &lt;p&gt;   &lt;br&gt;&lt;a target="_blank" href="http://www.controlchaos.com/"&gt;Ken Schwaber&lt;/a&gt;, le papa de Scrum, est à l'origine du projet et a établi un programme spécifique pour les développeurs. Le programme comble ainsi un manque terrible dans bon nombres de cursus agiles : la formation des développeurs.    &lt;br&gt;L'objectif est ici de fournir la connaissance des outils et des pratiques qui permettront à un développeur de répondre aux différentes contraintes des projets agiles :    &lt;br&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;réactivité&lt;/li&gt;    &lt;li&gt;Développement empirique&lt;/li&gt;    &lt;li&gt;gestion du changement&lt;/li&gt;    &lt;li&gt;collaboration&lt;/li&gt;    &lt;li&gt;...&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;nbsp; &lt;br&gt;A l'heure actuelle, deux cursus sont disponibles pour les deux plate-formes majeures de l'industrie .Net et Java.    &lt;br&gt;A &lt;a target="_blank" href="http://www.pyxis-tech.ca"&gt;Pyxis technologies&lt;/a&gt;, nous comptons parmi nous les 2 seuls formateurs francophones (&lt;a target="_blank" href="http://courses.scrum.org/about/eric-mignot"&gt;Eric Mignot&lt;/a&gt; et &lt;a target="_blank" href="http://courses.scrum.org/about/ernst-perpignand"&gt;Ernst Perpignand&lt;/a&gt;) et j'aurais l'occasion de binômer avec eux sur ces formations et ainsi apporter mes connaissances et mon expérience sur Team System et Team Foundation Server.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Les dates : &lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://courses.scrum.org/classes/show/20"&gt;du 7 au 11 juin à Montréal&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a target="_blank" href="http://courses.scrum.org/classes/show/19"&gt;du 21 au 25 juin à Paris&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En espérant vous rencontrer devant un VS10 pour parler architecture agile, TDD, scripts de build…&lt;/p&gt;&lt;img src="http://batswirl.com/aggbug.aspx?PostID=60" width="1" height="1"&gt;</description><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Team+Foundation+Server/default.aspx">Team Foundation Server</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Agile/default.aspx">Agile</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/TDD/default.aspx">TDD</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Scrum.org/default.aspx">Scrum.org</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>Rhino Mock / MSTest : Isolation</title><link>http://batswirl.com/blogs/batswirl_fr/archive/2010/02/08/rhino-mock-mstest-isolation.aspx</link><pubDate>Sun, 07 Feb 2010 21:23:00 GMT</pubDate><guid isPermaLink="false">bf5799a0-ebdd-4960-adab-bab5df34bb7d:56</guid><dc:creator>batswirl</dc:creator><slash:comments>0</slash:comments><comments>http://batswirl.com/blogs/batswirl_fr/comments/56.aspx</comments><wfw:commentRss>http://batswirl.com/blogs/batswirl_fr/commentrss.aspx?PostID=56</wfw:commentRss><description>
&lt;DIV class=csharpcode&gt;
&lt;P&gt;&lt;SPAN class=lnum&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=lnum&gt;Dans ce post, j’aimerais vous présenter diverses méthodes permettant d’effectuer des tests de comportements sur vos composants. On ne teste pas le contexte, les données retournées mais bien le comportement de la routine avec l’appelant et les dépendances.&lt;/SPAN&gt;&lt;/P&gt;
&lt;H4&gt;Contexte&lt;/H4&gt;
&lt;P&gt;On souhaite tester une méthode d’un dépôt(notion de &lt;A href="http://dddstepbystep.com/wikis/ddd/repository.aspx"&gt;repository&lt;/A&gt; en DDD). La routine en question est un service permettant d’envoyer des entités (&lt;STRONG&gt;Demande&lt;/STRONG&gt;) à un service Web pour centraliser ces demandes. Les différentes actions effectuées sont les suivantes :&lt;/P&gt;
&lt;P&gt;L’appelant appelle la méthode &lt;STRONG&gt;EnvoyerTout&lt;/STRONG&gt; prenant en paramètre une liste de &lt;STRONG&gt;Demande&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Le dépôt reçoit la liste et vérifie les informations de synchronisation dans une base de données locale.&lt;/P&gt;
&lt;P&gt;Le dépôt envoie la liste des demandes et les informations de synchronisation au service.&lt;/P&gt;
&lt;P&gt;Le service répond et fournit des informations permettant d’enregistrer en local que les demandes ont déjà été envoyé au serveur.&lt;/P&gt;
&lt;P&gt;Afin de limiter le trafic réseau, on souhaite vérifier que les demandes réellement envoyées au serveur n’avait jamais été envoyées. Cette information est disponible dans la base de données de locale.&lt;/P&gt;
&lt;P&gt;On souhaite isoler le comportement de cette routine car nous détectons rapidement les différentes dépendances :&lt;/P&gt;
&lt;P&gt;Un service Web qui doit répondre aux différentes requêtes du proxy.&lt;/P&gt;
&lt;P&gt;Une base de données contenant des informations de synchronisation.&lt;/P&gt;
&lt;P&gt;Une utilisation d’une dépôt permettant de récupérer les informations de l’utilisateur.&lt;/P&gt;
&lt;H4&gt;Explication du test&lt;/H4&gt;
&lt;P&gt;Voici donc le test en question :&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;DIV class=csharpcode&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   1:          &lt;/SPAN&gt;[TestMethod]&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   2:  &lt;/SPAN&gt;        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;void&lt;/SPAN&gt; EnvoyerToutNAjouteQueLesDemandesJamaisSynchronisees()&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   3:  &lt;/SPAN&gt;        {&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   4:  &lt;/SPAN&gt;            utilisateurDepot = mockRepository.Stub&amp;lt;IUtilisateurDepot&amp;gt;();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   5:  &lt;/SPAN&gt;            demandeDeControleService = mockRepository.StrictMock&amp;lt;DemandeDeControleService&amp;gt;();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   6:  &lt;/SPAN&gt;            demandeDeControleServeurDepot = mockRepository.Stub&amp;lt;DemandeDeControleServeurDepot&amp;gt;(demandeDeControleService, utilisateurDepot);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   7:  &lt;/SPAN&gt;            Expect.Call(demandeDeControleServeurDepot.GetReplicaId()).Return(Guid.NewGuid());&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;   8:  &lt;/SPAN&gt;            demandeDeControleServeurDepot.MettreAJourTousLesWatermark(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;, 0);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;   9:  &lt;/SPAN&gt;            LastCall.IgnoreArguments();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  10:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  11:  &lt;/SPAN&gt;            Expect.Call(demandeDeControleService.EnvoyerTout(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)).IgnoreArguments().Return(0).Repeat.Once();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  12:  &lt;/SPAN&gt;            mockRepository.ReplayAll();&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  13:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  14:  &lt;/SPAN&gt;            demandeDeControleServeurDepot.EnvoyerTout(CreerUneListeDeDemandes(5, 2));&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  15:  &lt;/SPAN&gt;&amp;nbsp;&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  16:  &lt;/SPAN&gt;            ServiceDomain.DemandeDeControle[] demandeDeControleEnvoyees =&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  17:  &lt;/SPAN&gt;                (ServiceDomain.DemandeDeControle[])demandeDeControleService.GetArgumentsForCallsMadeOn(x =&amp;gt; x.EnvoyerTout(&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt;)).First().First();&lt;/PRE&gt;&lt;PRE&gt;&lt;SPAN class=lnum&gt;  18:  &lt;/SPAN&gt;            Assert.AreEqual(2, demandeDeControleEnvoyees.Length);&lt;/PRE&gt;&lt;PRE class=alt&gt;&lt;SPAN class=lnum&gt;  19:  &lt;/SPAN&gt;        }&lt;/PRE&gt;
&lt;P&gt;Pour décrire ce test commençons par le commencement d’un test à savoir son assertion :&lt;/P&gt;
&lt;P&gt;Ligne 18 :&amp;nbsp; Assert.AreEqual(2, demandeDeControleEnvoyees.Length); On vérifie ici que le nombre de demandes envoyés au serveur est bien égale à 2.&lt;/P&gt;
&lt;P&gt;On pourrait donc traduire cette assertion de la sorte : &lt;FONT size=3&gt;&lt;EM&gt;Si l'application fournit une liste de 5 demandes au dépôt mais que seuls 2 demandes de cette liste doivent être envoyées au serveur, vérifie que le dépôt n'a envoyé que ces 2 éléments au service&lt;/EM&gt;&lt;/FONT&gt;. &lt;/P&gt;
&lt;P&gt;Pourquoi?&lt;/P&gt;
&lt;P&gt;Ligne 14 : &lt;STRONG&gt;demandeDeControleServeurDepot.EnvoyerTout(CreerUneListeDeDemandes(5, 2));&lt;/STRONG&gt; C’est la routine que nous souhaitons tester. Dans le test, le paramètre (la liste de demandes suceptibles d’être envoyées) est fourni par une méthode du test &lt;STRONG&gt;CreerUneListeDeDemandes(5, 2)&lt;/STRONG&gt; prenant en paramètre le nombre total de demande à créer et le nombre de demandes à synchroniser (et qui doivent donc réellement être envoyées au serveur).&lt;/P&gt;
&lt;P&gt;Et la rapport avec l’assertion?&lt;/P&gt;
&lt;P&gt;Ligne 16 et 17 : On récupère le premier paramètre du premier appel (il n’y en a qu’un) de l’exécution de la méthode &lt;STRONG&gt;EnvoyerTout&lt;/STRONG&gt; d’un mock (&lt;STRONG&gt;demandeDeControleService&lt;/STRONG&gt;) .C’est le cœur même du test et l’objet de l’assertion. Ces paramètres proviennet directement du mock, le service n’est jamais instancié.&lt;/P&gt;
&lt;P&gt;Et comment c’est possible?&lt;/P&gt;
&lt;P&gt;De la ligne 4 à la ligne 9 : on prépare l’exécution du test en isolant, à l’aide de diverses techniques et fonctionnalités de RhinoMock, les dépendances détectées.&lt;/P&gt;
&lt;P&gt;Ligne 4 : on crée un stub du dépot utilisateur, aucun comportement ou données ne nous&amp;nbsp;sont nécessaires. Nous avons juste besoin d’une instance de ce dépot pour l’instanciation ligne 6. Le fait de le “stuber” permet de ne pas exécuter le code de ce dépôt.&lt;/P&gt;
&lt;P&gt;Ligne 5 : On crée un mock strict. Toutes les fonctionnalités du service seront recrées et tous les appels vers le service seront redirigés vers ce mock.&lt;/P&gt;
&lt;P&gt;Ligne 6 à 12 : Création du mock partiel du composant testé. Toutes les routines réclamant un contexte (ligne 7 et 8, la récupération des informations de synchronisation nécessite une base de données locale) sont redirigés vers le mock. On peut configurer le résultat de l’exécution de la méthode du mock (ligne6 : &lt;STRONG&gt;demandeDeControleServeurDepot.GetReplicaId()).Return(Guid.NewGuid())&lt;/STRONG&gt; ) ou l’on peut déclarer d’ignorer l’appel et les paramètres (ligne 7).&lt;/P&gt;
&lt;P&gt;Sur ce mock partiel, on appelle la méthode testée (ligne 11).&lt;/P&gt;
&lt;P&gt;Tous les comportement d’isolation ne seront disponibles qu’après la ligne 12. Celle-ci permet d’informer RhinoMock des différentes instructions d’isolation.&lt;/P&gt;
&lt;H4&gt;Conclusion&lt;/H4&gt;
&lt;P&gt;Pas de base de données à construire et de données à générer. Pas de service sur un serveur de test. Mais le comportement attendu est vérifié et le sera même en cas de changement de source de données, de modification du contrat de service…&lt;/P&gt;
&lt;P&gt;Cool non?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://batswirl.com/aggbug.aspx?PostID=56" width="1" height="1"&gt;</description><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Agile/default.aspx">Agile</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Mock+DDD/default.aspx">Mock DDD</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/TDD/default.aspx">TDD</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/MSTest/default.aspx">MSTest</category><category domain="http://batswirl.com/blogs/batswirl_fr/archive/tags/Rhino/default.aspx">Rhino</category></item></channel></rss>