image de chargement
Retour au glossaire

TDD (Test-Driven Development)

Méthodologie de développement logiciel où les tests sont écrits avant le code de production, garantissant qualité et maintenabilité.

Mis à jour le 11 janvier 2026

Le Test-Driven Development (TDD) est une approche de développement logiciel qui inverse le processus traditionnel en écrivant d'abord les tests automatisés avant d'implémenter le code de production. Cette méthodologie suit un cycle itératif court appelé "Red-Green-Refactor" qui garantit une couverture de tests élevée et une conception modulaire. Le TDD transforme les tests d'une activité de vérification en un outil de conception qui guide l'architecture du code.

Fondements du TDD

  • Cycle Red-Green-Refactor : écrire un test qui échoue (Red), implémenter le code minimal pour le faire passer (Green), puis améliorer la qualité du code (Refactor)
  • Test First : les spécifications fonctionnelles sont traduites en tests exécutables avant toute implémentation
  • Feedback rapide : détection immédiate des régressions et validation continue de la logique métier
  • Design émergent : l'architecture du code émerge naturellement des contraintes imposées par les tests

Avantages du TDD

  • Qualité supérieure : réduction drastique des bugs en production grâce à une couverture de tests exhaustive
  • Documentation vivante : les tests servent de spécification exécutable et toujours à jour du comportement attendu
  • Refactoring sécurisé : modification du code sans risque grâce au filet de sécurité des tests automatisés
  • Conception modulaire : le TDD favorise naturellement le découplage et le respect des principes SOLID
  • Confiance accrue : déploiements plus sereins et réduction de la dette technique sur le long terme

Exemple concret

Prenons l'exemple d'une fonction de calcul de réduction commerciale suivant le cycle TDD complet :

discount.test.ts
// ÉTAPE 1 - RED : Écrire le test qui échoue
import { describe, it, expect } from 'vitest';
import { calculateDiscount } from './discount';

describe('calculateDiscount', () => {
  it('should apply 10% discount for orders above 100€', () => {
    const result = calculateDiscount(150);
    expect(result).toBe(135); // 150 - 15 = 135
  });

  it('should not apply discount for orders below 100€', () => {
    const result = calculateDiscount(50);
    expect(result).toBe(50);
  });

  it('should apply 20% discount for premium customers', () => {
    const result = calculateDiscount(200, { isPremium: true });
    expect(result).toBe(160); // 200 - 40 = 160
  });
});
discount.ts
// ÉTAPE 2 - GREEN : Implémentation minimale
interface DiscountOptions {
  isPremium?: boolean;
}

export function calculateDiscount(
  amount: number,
  options: DiscountOptions = {}
): number {
  if (options.isPremium) {
    return amount * 0.8; // 20% de réduction
  }
  
  if (amount >= 100) {
    return amount * 0.9; // 10% de réduction
  }
  
  return amount;
}

// ÉTAPE 3 - REFACTOR : Amélioration de la lisibilité
const DISCOUNT_RATES = {
  premium: 0.20,
  standard: 0.10,
} as const;

const MINIMUM_AMOUNT_FOR_DISCOUNT = 100;

export function calculateDiscount(
  amount: number,
  options: DiscountOptions = {}
): number {
  const discountRate = options.isPremium
    ? DISCOUNT_RATES.premium
    : amount >= MINIMUM_AMOUNT_FOR_DISCOUNT
    ? DISCOUNT_RATES.standard
    : 0;

  return amount * (1 - discountRate);
}

Mise en œuvre du TDD

  1. Définir une fonctionnalité ou un comportement spécifique à implémenter en partant du besoin métier
  2. Écrire un test unitaire qui décrit le comportement attendu et vérifier qu'il échoue (Red)
  3. Implémenter le code minimal nécessaire pour faire passer le test sans sur-ingénierie (Green)
  4. Exécuter tous les tests pour s'assurer qu'aucune régression n'a été introduite
  5. Refactoriser le code pour améliorer sa structure tout en gardant les tests au vert (Refactor)
  6. Répéter le cycle pour chaque nouvelle fonctionnalité ou cas limite identifié

Conseil professionnel

Commencez par le cas le plus simple (happy path) avant d'aborder les cas limites. Écrivez des tests qui décrivent le comportement métier plutôt que l'implémentation technique. Un bon test TDD doit rester valide même si vous changez complètement l'implémentation interne. Utilisez des noms de tests descriptifs en langage naturel pour qu'ils servent de documentation.

Outils et frameworks associés

  • Jest / Vitest : frameworks de tests JavaScript/TypeScript avec mocking intégré et watch mode
  • JUnit / TestNG : standards Java pour les tests unitaires avec annotations et assertions
  • pytest : framework Python privilégiant la simplicité avec fixtures et parameterized tests
  • RSpec : DSL Ruby pour les tests comportementaux avec syntaxe expressive
  • Mocha + Chai : combinaison flexible pour Node.js avec différents styles d'assertions
  • Kent Beck's TDD by Example : ouvrage fondateur décrivant la méthodologie complète

Le TDD représente un investissement initial en temps qui se traduit par des gains substantiels en maintenabilité, réduction des bugs et vélocité d'équipe sur le long terme. En imposant une discipline de conception par les tests, cette approche produit un code plus modulaire, mieux documenté et évolutif. Pour les organisations cherchant à réduire leur dette technique et améliorer la qualité logicielle, le TDD constitue une pratique fondamentale qui transforme durablement la culture d'ingénierie.

L'argentestdéjàsurlatable.

En 1 heure, découvrez exactement combien vous perdez et comment le récupérer.