{"id":446,"date":"2016-06-28T14:45:44","date_gmt":"2016-06-28T13:45:44","guid":{"rendered":"http:\/\/lalloue.fr\/blog\/?p=446"},"modified":"2016-06-28T15:34:09","modified_gmt":"2016-06-28T14:34:09","slug":"integrer-les-test-unitaires-a-un-projet-xamarin","status":"publish","type":"post","link":"http:\/\/lalloue.fr\/blog\/integrer-les-test-unitaires-a-un-projet-xamarin\/","title":{"rendered":"Int\u00e9grer les test unitaires \u00e0 un projet Xamarin"},"content":{"rendered":"<p><a href=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/wamarin-nunit.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-462 size-medium\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/wamarin-nunit-300x110.png\" alt=\"wamarin-nunit\" width=\"300\" height=\"110\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/wamarin-nunit-300x110.png 300w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/wamarin-nunit.png 700w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Les <strong>tests unitaires<\/strong> sont souvent d\u00e9laiss\u00e9s dans les applications, mais font pourtant partis des briques les plus importantes \u00e0 mettre en place.<br \/>\nLe temps pass\u00e9 \u00e0 les mettre en place sera gagn\u00e9 par la suite par les bugs qu&#8217;il n&#8217;y aura pas besoin de corriger.<\/p>\n<p>Pour les projets .NET, il existe\u00a02 solutions de tests automatis\u00e9s :<\/p>\n<ul>\n<li>Utiliser MS Test (solution Microsoft)<\/li>\n<li>Utiliser le framework de test unitaires\u00a0<strong>Nunit<\/strong> ou <strong>Touch.Unit<\/strong>, la version plus all\u00e9g\u00e9e du premier.<\/li>\n<\/ul>\n<p>Nous allons ici pr\u00e9senter l&#8217;utilisation de NUnit.<\/p>\n<p><!--more--><\/p>\n<h3>Nunit ?<\/h3>\n<p>Nunit est un framework de tests unitaires pour le langage .Net.<\/p>\n<p>Le projet a \u00e9t\u00e9\u00a0initialement port\u00e9 depuis la JUnit, mais propose aujourd&#8217;hui sa version 3.0 qui a \u00e9t\u00e9 enti\u00e8rement r\u00e9\u00e9crite pour y ajouter de nouvelles fonctionnalit\u00e9s.<\/p>\n<h3>Installation<\/h3>\n<p>Pour commencer, cr\u00e9er un nouveau projet dans votre solution &#8220;&lt;project&gt;.Tests&#8221; (avec &lt;project&gt; le nom de votre projet).<\/p>\n<p>Il est \u00e9galement possible de cr\u00e9er les tests directement dans votre projet existant, mais \u00e7a sera plus propre de les concentrer \u00e0 un seul endroit.<\/p>\n<p>Pour ma part, j&#8217;ai cr\u00e9\u00e9 un projet de type &#8220;Unit Test Project&#8221; qui est en fait un projet &#8220;MS Test&#8221; mais une fois la r\u00e9f\u00e9rence au framework MS Test c&#8217;est un projet simple qui \u00e0 l&#8217;avantage d&#8217;avoir un ic\u00f4ne remarquable facilement.<\/p>\n<p><a href=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-create-project.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-451\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-create-project.png\" alt=\"nunit-create-project\" width=\"750\" height=\"353\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-create-project.png 937w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-create-project-300x141.png 300w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-create-project-768x361.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/a><\/p>\n<p>Dans ce nouveau projet, il est n\u00e9cessaire d&#8217;installer ensuite le package\u00a0&#8220;NUnit 3&#8221; et &#8220;NUnit3TestAdapter&#8221;.<\/p>\n<p>Pour cela ouvrir &#8220;Le gestionnaire de package NuGet&#8221; (clic droit projet \/ Manage NuGet packages), puis rechercher &#8220;NUnit&#8221; et &#8220;NUnit test adapter&#8221;.<\/p>\n<p><a href=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-nuget.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-453\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-nuget.png\" alt=\"nunit-nuget\" width=\"750\" height=\"550\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-nuget.png 822w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-nuget-300x220.png 300w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/nunit-nuget-768x563.png 768w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/a><\/p>\n<p>NUnit test adapter permet d&#8217;inclure NUnit \u00e0 Visual Studio sans avoir \u00e0 installer de package VSIX Adapter et pouvoir ainsi executer les tests depuis l&#8217;interface Visual Studio.<\/p>\n<p><strong><span style=\"color: #2db3e7;\">Note :<\/span><\/strong> L&#8217;installation n\u00e9cessite ensuite un red\u00e9marrage de Visual Studio.<\/p>\n<h3>Mise en place<\/h3>\n<p>On se retrouve donc avec un projet Xamarin et un projet &#8220;Tests Unitaires&#8221; qui peut ressembler \u00e0 l&#8217;organisation suivante :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nProject Solution\r\n...Project (Portable ou Shared, contient le code partag\u00e9)\r\n...Project.iOS\r\n...Project.Droid\r\n...Project.WinPhone (Windows Phone 8.1)\r\n...Project.Tests (Contient les tests unitaires)\r\n<\/pre>\n<p>Pour un bon d\u00e9coupage de l&#8217;application, le code \u00e0 tester devrait se trouver uniquement dans le projet &#8220;Project&#8221; contenant le code partag\u00e9.<br \/>\nLes autres projets contenant normalement uniquement le code d&#8217;interface propre \u00e0 chaque plateforme.<br \/>\nPour tester le code des interfaces, il existe des tests d&#8217;UI, mais qui sont diff\u00e9rents des tests unitaires trait\u00e9s dans cet article.<\/p>\n<p>Il est ensuite n\u00e9cessaire d&#8217;indiquer au projet de Test les projets contenant les classes test\u00e9es.<br \/>\nPour cela, ajouter une r\u00e9f\u00e9rence au projet &#8220;Project.Tests&#8221;\u00a0du projet &#8220;Project&#8221;.<\/p>\n<p>Les conventions de nommage des tests indiquent le plus souvent les r\u00e8gles suivantes \u00e0 respecter :<\/p>\n<ul>\n<li>La classe de test doit se nommer de la m\u00eame fa\u00e7on que la classe test\u00e9e suffix\u00e9e de &#8220;Test&#8221;\n<ul>\n<li>Exemple : La classe de tests de &#8220;Calculator.cs&#8221; doit s&#8217;appeler &#8220;CalculatorTest.cs&#8221;<\/li>\n<\/ul>\n<\/li>\n<li>La hi\u00e9rarchie du projet test\u00e9 doit se retrouver dans le projet de tests<\/li>\n<\/ul>\n<h3>R\u00e9daction des tests<\/h3>\n<p>Prenons l&#8217;exemple d&#8217;une classe &#8220;Calculette&#8221; contenue dans le projet &#8220;Project&#8221; permettant d&#8217;effectuer des additions et multiplications :<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nnamespace Calculator\r\n{\r\n    public class Calculette\r\n    {\r\n        public int Addition(int num1, int num2)\r\n        {\r\n            int resultat = num1 + num2;\r\n            return resultat;\r\n        }\r\n\r\n        public int Multiplication(int num1, int num2)\r\n        {\r\n            int resultat = num1 + num2;\r\n            return resultat;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Afin de tester cette classe, cr\u00e9ons un fichier &#8220;CalculetteTest&#8221; dans le projet &#8220;Project.Tests&#8221; :<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nnamespace Calculator.Tests\r\n{\r\n    [TestFixture]\r\n    public class CalculetteTest\r\n    {\r\n        #region Init\r\n\r\n        private Calculette calculette = new Calculette();\r\n\r\n        #endregion\r\n\r\n        #region Tests\r\n\r\n        [Test]\r\n        public void TestAddition()\r\n        {\r\n            int resultat = calculette.Addition(7, 8);\r\n            Assert.That(resultat, Is.EqualTo(15));\r\n        }\r\n\r\n        [Test]\r\n        public void TestMultiplication()\r\n        {\r\n            int resultat = calculette.Multiplication(7, 8);\r\n            Assert.That(resultat, Is.EqualTo(56));\r\n        }\r\n\r\n        #endregion\r\n    }\r\n}\r\n<\/pre>\n<p>Pour les tests, il est n\u00e9cessaire d&#8217;utiliser les tags cl\u00e9s suivants :<\/p>\n<ul>\n<li>L&#8217;attribut\u00a0<strong><span style=\"color: #2db3e7;\">TestFixture<\/span> <\/strong>pour cr\u00e9er la classe de test<\/li>\n<li>L&#8217;attribut <strong><span style=\"color: #2db3e7;\">Test<\/span> <\/strong>pour cr\u00e9er la m\u00e9thode de test<\/li>\n<\/ul>\n<p><strong>Et c&#8217;est l\u00e0 qu&#8217;intervient &#8220;NUnit Test adapter&#8221;<\/strong>.<br \/>\nCet outils va permettre \u00e0 Visual Studio de trouver tous les tests unitaires qui ont \u00e9t\u00e9 cr\u00e9\u00e9s dans la solution.<\/p>\n<p>Pour ouvrir la liste de test, ouvrir le Menu &#8220;Test &gt; Windows &gt; test Explorer&#8221; :<\/p>\n<p><a href=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-457 size-full\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer.png\" alt=\"vs-test-explorer\" width=\"446\" height=\"232\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer.png 446w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer-300x156.png 300w\" sizes=\"(max-width: 446px) 100vw, 446px\" \/><\/a><\/p>\n<p>Les tests ne vont pas appara\u00eetre tout de suite, il est d&#8217;abord n\u00e9cessaire de builder la solution.<br \/>\nUne fois que c&#8217;est fait, les tests unitaires vont appara\u00eetre, il suffira alors de cliquer sur &#8220;Run All&#8221; pour tous les ex\u00e9cuter :<\/p>\n<p><a href=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer-result.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-458\" src=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer-result.png\" alt=\"vs-test-explorer-result\" width=\"299\" height=\"311\" srcset=\"http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer-result.png 299w, http:\/\/lalloue.fr\/blog\/wp-content\/uploads\/2016\/06\/vs-test-explorer-result-288x300.png 288w\" sizes=\"(max-width: 299px) 100vw, 299px\" \/><\/a><\/p>\n<p>Et l\u00e0&#8230;si vous aviez bien suivi l&#8217;article vous auriez remarqu\u00e9 que dans la m\u00e9thode de multiplication on a effectu\u00e9 une addition &#8220;+&#8221; \u00e0 la place d&#8217;une multiplication &#8220;*&#8221;, c&#8217;est donc normal que le test soit en \u00e9chec pour cette m\u00e9thode.<\/p>\n<p>Vous avez ici vos premiers tests unitaires !<\/p>\n<h3>Ressources suppl\u00e9mentaires<\/h3>\n<p>La documentation de NUnit est tr\u00e8s compl\u00e8te et facilement lisible, je vous conseille d&#8217;aller y jeter un \u0153il pour y trouver les informations qu&#8217;il vous manque :<\/p>\n<p>Documentation\u00a0NUnit :\u00a0<a href=\"https:\/\/github.com\/nunit\/docs\/wiki\/NUnit-Documentation\">https:\/\/github.com\/nunit\/docs\/wiki\/NUnit-Documentation<\/a><\/p>\n<p>Comment r\u00e9diger ses tests :\u00a0<a href=\"https:\/\/github.com\/nunit\/docs\/wiki\/Attributes\">https:\/\/github.com\/nunit\/docs\/wiki\/Attributes<\/a><\/p>\n<p>Et si vous trouvez l&#8217;\u00e9criture des tests difficile et pas tr\u00e8s compr\u00e9hensibles, une solution existe :\u00a0<a href=\"http:\/\/www.fluentassertions.com\/\">fluent assertions<\/a>.<br \/>\nCette librairie permet de cr\u00e9er des tests d&#8217;assertion plus lisibles et plus facile \u00e0 d\u00e9bugguer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les tests unitaires sont souvent d\u00e9laiss\u00e9s dans les applications, mais font pourtant partis des briques les plus importantes \u00e0 mettre en place. Le temps pass\u00e9 \u00e0 les mettre en place sera gagn\u00e9 par la suite par les bugs qu&#8217;il n&#8217;y aura pas besoin de corriger. Pour les projets .NET, il existe\u00a02 solutions de tests automatis\u00e9s &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/lalloue.fr\/blog\/integrer-les-test-unitaires-a-un-projet-xamarin\/\" class=\"more-link\">Continuer la lecture <span class=\"screen-reader-text\"> \u00ab\u00a0Int\u00e9grer les test unitaires \u00e0 un projet Xamarin\u00a0\u00bb<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/446"}],"collection":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/comments?post=446"}],"version-history":[{"count":15,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions"}],"predecessor-version":[{"id":483,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/posts\/446\/revisions\/483"}],"wp:attachment":[{"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/media?parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/categories?post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/lalloue.fr\/blog\/wp-json\/wp\/v2\/tags?post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}