MsTest V2 : tests unitaires paramétriques
Un tutoriel de Hinault Romaric

Le , par Hinault Romaric, Responsable .NET
MsTest V2 : Tests unitaires paramétriques
En termes de fonctionnalités, parmi les choses qu’on reproche à MsTest (le Framework de test unitaire de Microsoft) par rapport à NUnit, il y a l’absence de la prise en charge des tests paramétriques. Le manque de support de cette fonctionnalité est suffisant pour que plusieurs développeurs se tournement vers NUnit au détriment de MsTest.

Concrètement, que sont les tests paramétriques ?

Lorsqu’on effectue des tests unitaires, il arrive des cas où l’on souhaite tester une méthode en utilisant des données différentes. Pour éviter d’avoir à écrire plusieurs méthodes de tests avec différentes données en entrée, il est possible de :

  • créer un tableau avec les données du test, et utiliser une boucle dans la méthode de test. Cette approche est à éviter, car elle ne permet pas d’identifier les paramètres qui ont fait échouer le test. De plus, lorsque le test échoue, l’exécution est arrêtée et le reste des données du tableau ne sont pas utilisées pour continuer à tester la méthode.
  • créer un test piloté par les données (DDT). Cette approche permet une bonne couverture du code, car le test est exécuté à plusieurs reprises, pour chaque ligne dans une source de données. Cependant, cette approche nécessite l’utilisation d’une base de données ou des fichiers (XML, CSV, Excel, etc.) comme source de données. Ce qui n’est pas très pratique pour un petit volume de données.
  • l’utilisation des tests paramétriques. Cette dernière approche consiste à passer un jeu de données en paramètre pour une méthode de test. Comme pour le DDT, la méthode de test est exécutée pour chaque ligne du jeu de données. L’échec d’une ligne du jeu de données de test ne met pas fin à l’exécution du test.



Avec la sortie de MsTest V2 (qui est actuellement au stade de préversion), le support des tests paramétriques a été généralisé à l’ensemble des projets de test .NET. En effet, Microsoft offrait déjà une prise en charge de cette fonctionnalité. Mais, celle-ci était possible uniquement pour des projets de test pour Windows Phone, Modern UI ou Universal Windows. Ceci parce que MsTest offre deux infrastructures pour les tests unitaires : Microsoft.VisualStudio.TestTools.UnitTesting et Microsoft.VisualStudio.TestPlatform.UnitTestFramework.

Dans MsTest V2, Microsoft offre une architecture unifiée, permettant ainsi d’étendre les tests unitaires paramétriques à l’ensemble des projets de test .NET. Ce qui permet à la firme de répondre à une demande des développeurs qui avait enregistré près de 1300 votes.

La mise en place des tests paramétriques se fait en utilisant les attributs [DataTestMethod] et [DataRow]

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
[DataTestMethod] 
        [DataRow(1, 1, 2)] 
        [DataRow(2, 2, 4)] 
        [DataRow(3, 3, 4)] 
        [DataRow(4, 4, 8)] 
        [DataRow(5, 5, 11)] 
        public void DataTestMethod1(int a, int b, int result) 
        { 
            Assert.AreEqual(result, a + b); 
        }

Comme vous pouvez le constater avec la capture ci-dessous, mon test est exécuté autant de fois que j’ai des DataRow. Le test échoue à la ligne 3 et la ligne 5. Le test est exécuté de façon séquentielle. Un petit bémol est qu’on n’a pas d’information sur la ligne qui a échoué. On peut remédier à cela en utilisant le paramètre DisplayName :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
[DataTestMethod] 
        [DataRow(1, 1, 2, DisplayName = "First Line")] 
        [DataRow(2, 2, 4, DisplayName = "Second Line")] 
        [DataRow(3, 3, 4, DisplayName = "Third Line")] 
        [DataRow(4, 4, 8, DisplayName = "Fourth Line")] 
        [DataRow(5, 5, 11, DisplayName = "Fifth Line")] 
        public void DataTestMethod1(int a, int b, int result) 
        { 
            Assert.AreEqual(result, a + b) 
        }

Ou encore en affichant un message de sortie dans l’assertion :

Code c# : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
[DataTestMethod] 
        [DataRow(1, 1, 2)] 
        [DataRow(2, 2, 4)] 
        [DataRow(3, 3, 4)] 
        [DataRow(4, 4, 8)] 
        [DataRow(5, 5, 11)] 
        public void DataTestMethod1(int a, int b, int result) 
        { 
            Assert.AreEqual(result, a + b, "DataAttributes_" + a + "_" + b + "_" +result); 
        }

Pour plus de détails sur MsTest V2 et comment l’installer, vous pouvez consulter mon billet de blog suivant :



Les billets ci-dessous vous permettent également d’en apprendre plus sur l’écriture des tests unitaires avec MsTest V2.



Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -