Bonjour à tous
Nous allons voir dans ce tutoriel comment faire des tests unitaires avec MSTest et .NET Core
Vous êtes prêts ?
1 - Création du projet source
Ouvrez une fenêtre d'interpréteur de commandes et créez le dossier suivant avec mkdir
mkdir mstest
cd mstest
Créez la solution
dotnet new sln
Créez le dossier du projet source
mkdir PrimeService
cd PrimeService
Créez un projet source de type bibliothèque de classes
dotnet new classlib
Renommez la classe Class1.cs en PrimeService.cs
rename Class1.cs PrimeService.cs
Éditez la classe PrimeService.cs avec votre éditeur de texte
using System;
namespace Prime.Services
{
public class PrimeService
{
public bool IsPrime(int value)
{
throw new NotImplementedException("Vous devez implémenter cette méthode");
}
}
}
La classe PrimeService contient pour l'instant une méthode non implémentée IsPrime()
Vous devez ajouter le projet PrimeService à votre solution
(Vérifiez que vous êtes dans le dossier racine de la solution)
dotnet sln add PrimeService/PrimeService.csproj
2 - Création du projet Tests
Nous allons créer un projet Tests, c'est ici que nous effectuerons nos tests et vérifierons que nos classes et méthodes fonctionnent comme prévu
Les tests unitaires sont un moyen formidable de garantir la non régression du code d'une application
Tout développeur C# doit les exécuter pour s'assurer que ses modifications sur le code n'ont pas de répercutions sur les autres fonctionnalités de l'application
Le développeur C# doit aussi ajouter de nouveaux tests pour valider ses propres modifications
Créez donc un dossier PrimeService_Tests pour accueillir le projet Tests
mkdir PrimeService_Tests
cd PrimeService_Tests
Créez un nouveau projet de type mstest
dotnet new mstest
La commande 'dotnet new mstest' va créer un projet de tests qui utilise la librairie de tests unitaires MSTest
Nous allons ajouter la bibliothèque de classes PrimeService que nous souhaitons tester comme dépendance au projet de tests PrimeService_Tests
(Vérifiez que vous êtes dans PrimeService_Tests)
dotnet add reference ../PrimeService/PrimeService.csproj
Nous allons maintenant ajouter le projet PrimeService_Tests à la solution
(Vérifiez que vous êtes à la racine de la solution)
dotnet sln add PrimeService_Tests\PrimeService_Tests.csproj
3 - Création du premier test
Dans PrimeService_Tests, renommez la classe UnitTest1.cs en PrimeService_IsPrimeShould.cs
cd PrimeService_Tests
rename UnitTest1.cs PrimeService_IsPrimeShould.cs
Maintenant nous sommes prêts à rédiger méticuleusement nos tests...
L'approche TDD impose d'écrire un test défaillant et de le corriger pour qu'il réussisse
Vous allez faire un premier test pour vérifier que la méthode publique isPrime() de la classe PrimeService retourne bien 'Faux' si vous lui passer '1' car le chiffre 1 n'est pas un nombre premier
Éditez donc la classe PrimeService_IsPrimeShould.cs, elle doit ressembler à ceci :
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;
namespace Prime.UnitTests.Services
{
[TestClass]
public class PrimeService_IsPrimeShould
{
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
[TestMethod]
public void ReturnFalseGivenValueOf1()
{
var result = _primeService.IsPrime(1);
Assert.IsFalse(result, "1 ne doit pas être un nombre premier");
}
}
}
Je résume...
Après avoir importé le type 'Microsoft.VisualStudio.TestTools.UnitTesting' et après avoir importé le projet source que vous souhaitez tester; vous devez créer une classe publique et vous devez la marquer avec un attribut [TestClass] pour dire au framework de tests que c'est ça la classe que vous souhaitez tester, ensuite vous devez déclarer une variable privée en lecture seule de type PrimeService (la bibliothèque de classes à tester). Après vous devez initialiser cette variable dans le constructeur de la classe en lui affectant une instance de l'objet que vous voulez tester, dans notre cas c'est PrimeService
Un nombre premier est un nombre entier naturel (non nul) qui admet exactement 2 diviseurs distincts : 1 et lui-même
Voici les 25 nombres premiers inférieurs à 100 :
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 et 97
Compilez vos deux projets et exécutez les tests
dotnet build
dotnet test
Aïe aïe aïe...votre test échoue. C'est normal vous n'avez pas encore implémentée la méthode isPrime() pour qu'il réussisse
Comme tout bon développeur Csharp vous connaissez la méthode TDD pour Test-Driven Development, ou développement piloté par les tests, et vous savez l'appliquer...
La méthode TDD permet d'explorer et de préciser le besoin, puis de spécifier le comportement souhaité du logiciel en fonction de son utilisation avant le codage
Voici les 5 étapes du cycle TDD :
Écrire un seul test qui décrit une partie du problème
Vérifier que le test échoue
Écrire juste assez de code pour que le test réussisse
Vérifier que le test passe
Remanier le code et l'améliorer sans en changer le comportement
Vous savez qu'il faut répéter successivement ce cycle jusqu'à résoudre le problème
Puisque vous êtes un bon développeur C# donc vous le savez !
Écrivez donc le code le plus simple qui fonctionne dans la classe PrimeService :
public bool IsPrime(int value)
{
if (value== 1)
{
return false;
}
throw new NotImplementedException("Vous devez implémenter cette méthode");
}
Ré-exécutez 'dotnet test' dans le répertoire mstest
Vous remarquerez cette fois que le test est passé avec succès
4 - Ajout de fonctionnalités supplémentaires
Dans cette partie du tuto nous allons utiliser l'attribut [DataTestMethod]
L'attribut [DataTestMethod] représente une suite de tests qui exécutent la même méthode avec des arguments différents
Vous pouvez utiliser l'attribut [DataRow] pour spécifier les valeurs à passer à la méthode
Au lieu de créer de nouveaux tests, appliquez seulement ces deux attributs pour créer un test unique piloté par les données
[DataTestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void ReturnFalseGivenValuesLessThan2(int value)
{
var result = _primeService.IsPrime(value);
Assert.IsFalse(result, $"{value} ne doit pas être un nombre premier");
}
Exécutez 'dotnet test'
Deux de vos tests échouent
Pour que tous vos tests réussissent, modifiez simplement la clause if au début de la méthode IsPrime():
if (value< 2)
Voilà c'est tout pour aujourd'hui !
Vous pouvez Télécharger le code source ou regarder la vidéo
Continuez votre lecture avec : Comment implémenterait un développeur csharp la persistance de données avec le framework ORM Fluent NHibernate
Commentaires
Développé par Developpeur-Csharp.com Mentions légales
Testé et compatible, à partir de : Firefox 3, Internet Explorer 7.0, Safari 4, Chrome, et Opera 9.