Aller au contenu

Implémenter des tests unitaires

unittest : tests unitaires

TestCase fournit des assertions et un cadre d'exécution des tests. Les méthodes dont le nom commence par test_ sont détectées.

import unittest

def calculate_total(price, tax_rate=0.20):
    return price * (1 + tax_rate)

class PricingTests(unittest.TestCase):
    def test_standard_tax(self):
        self.assertAlmostEqual(calculate_total(100), 120)

    def test_zero_tax(self):
        self.assertEqual(calculate_total(100, 0), 100)

if __name__ == "__main__":
    unittest.main()

Enregistrons le fichier sous test_pricing.py, puis exécutons :

python -m unittest test_pricing.py

Les assertions usuelles incluent assertEqual(), assertTrue(), assertIsNone() et assertRaises(). Le sous-module unittest.mock permet de remplacer temporairement des dépendances.

Parallèle C# et .NET

// À placer dans un projet MSTest, pas dans Program.cs d'une console.
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class PricingTests
{
    private static double CalculateTotal(double price, double taxRate = 0.20)
        => price * (1 + taxRate);

    [TestMethod]
    public void StandardTax()
        => Assert.AreEqual(120.0, CalculateTotal(100), 1e-9);

    [TestMethod]
    public void ZeroTax()
        => Assert.AreEqual(100.0, CalculateTotal(100, 0));
}

MSTest est un rapprochement courant, mais ses outils et packages sont distribués séparément ; contrairement à unittest, ce n’est pas un module inclus dans l’exécution standard. Créons le projet avec dotnet new mstest, remplaçons le test généré puis exécutons dotnet test. xUnit et NUnit sont d’autres options. La tolérance numérique explicite n’a pas exactement la même convention que assertAlmostEqual().