Tests en C# (.NET) : frameworks et outils
Les tests sont une partie essentielle du développement professionnel sur la plateforme .NET. Une couverture de code de qualité par des tests réduit le nombre de bogues, simplifie le refactoring et renforce la confiance dans le produit. Dans l'écosystème C#, il existe de nombreux frameworks et utilitaires matures, chacun résolvant des tâches spécifiques : des tests unitaires aux vérifications d'intégration et aux tests d'interface utilisateur. Dans cet article, nous allons passer en revue les principaux outils, leurs fonctionnalités et des exemples d'utilisation.
Frameworks principaux pour les tests unitaires
Les tests unitaires sont la base de la pyramide des tests. Dans .NET Core / .NET 5+, le standard de facto est devenu xUnit.net, bien que NUnit et MSTest soient également activement utilisés.
xUnit.net
Framework moderne, flexible et le plus populaire. Il fonctionne selon le principe des "faits" (facts) et des "théories" (theories).
- Faits (Fact) — tests simples sans paramètres.
- Théories (Theory) — tests paramétrés avec des données provenant des attributs
[InlineData]ou[MemberData]. - Ne nécessite pas l'attribut
[TestClass]— toute classe publique peut contenir des tests.
using Xunit;
public class CalculatorTests{ [Fact] public void Add_ShouldReturnSum() { // Arrange var calc = new Calculator(); // Act var result = calc.Add(2, 3); // Assert Assert.Equal(5, result); }
[Theory] [InlineData(1, 2, 3)] [InlineData(-1, -1, -2)] public void Add_WithMultipleInputs_ShouldReturnCorrectSum(int a, int b, int expected) { var calc = new Calculator(); var result = calc.Add(a, b); Assert.Equal(expected, result); }}NUnit
Framework classique avec une riche histoire. Il se distingue par des attributs puissants et la prise en charge de la paramétrisation.
- Utilise les attributs
[Test],[TestCase],[SetUp]. - Prend en charge l'exécution parallèle des tests.
- Pratique pour les scénarios complexes avec des données de test.
using NUnit.Framework;
[TestFixture]public class CalculatorNUnitTests{ [Test] public void Subtract_ShouldReturnDifference() { var calc = new Calculator(); var result = calc.Subtract(10, 4); Assert.That(result, Is.EqualTo(6)); }
[TestCase(5, 3, 2)] [TestCase(0, 0, 0)] public void Subtract_WithParameters_ShouldReturnCorrect(int a, int b, int expected) { var calc = new Calculator(); Assert.That(calc.Subtract(a, b), Is.EqualTo(expected)); }}MSTest
Framework intégré de Microsoft. Idéal pour les projets simples et les équipes travaillant dans l'écosystème Visual Studio.
- Attributs :
[TestMethod],[TestClass],[DataRow]. - Intégration étroite avec Azure DevOps et les pipelines CI/CD.
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]public class CalculatorMSTests{ [TestMethod] public void Multiply_ShouldReturnProduct() { var calc = new Calculator(); var result = calc.Multiply(4, 5); Assert.AreEqual(20, result); }
[DataRow(2, 3, 6)] [DataRow(0, 100, 0)] [DataTestMethod] public void Multiply_WithDataRows_ShouldReturnCorrect(int a, int b, int expected) { var calc = new Calculator(); Assert.AreEqual(expected, calc.Multiply(a, b)); }}Bibliothèques pour objets mock et isolation
Lors des tests unitaires, il est souvent nécessaire d'isoler le code testé des dépendances externes (BDD, API, système de fichiers). Pour cela, on utilise des frameworks de mock.
Moq
Le framework le plus populaire
Aussi dans la bibliothèque
Bibliothèque standard JavaScript (Node.js) : aperçu complet
Métriques Prometheus en Go : création et exportation de métriques en Golang
Client HTTP pour Kotlin : Top bibliothèques pour travailler avec le réseau