Les tests unitaires : Sécuriser son code avant la mise en production !

#test-unitaire#CI/CD#CodeQuality

mercredi 12 février 2025

1. Pourquoi écrire des tests unitaires ?

Déployer du code en production sans tests unitaires, c’est un peu comme conduire une voiture sans freins : tu peux avancer, mais le risque de crash est énorme !

Les tests unitaires permettent de vérifier que chaque fonction ou composant fonctionne comme prévu avant même que le code n’atteigne la phase de test manuel ou la production.

🎯 Avantages des tests unitaires :

✅ Détection des bugs dès le développement (réduction du coût des corrections).
✅ Sécurité accrue lors des modifications et refactorings.
✅ Documentation vivante du comportement du code.
✅ Moins de stress en production.

2. Les différents types de tests

Les tests unitaires ne sont qu’une partie d’un processus de test complet. Pour garantir une application robuste, il est important de connaître et d’utiliser d’autres types de tests :

🛠️ Tests unitaires

But : Vérifier que chaque fonction ou composant fonctionne correctement indépendamment des autres.

Exemple : Tester une fonction de calcul ou une validation de formulaire.

🛠️ Tests d’intégration

But : Vérifier que plusieurs composants ou modules fonctionnent ensemble.

Exemple : Tester une API qui récupère des données d’une base de données et les affiche dans une interface utilisateur.

🛠️ Tests fonctionnels (ou tests end-to-end - E2E)

But : Vérifier l’ensemble du système du point de vue de l’utilisateur.

Exemple : Tester un parcours utilisateur complet (connexion, ajout d’un produit au panier, validation du paiement).

🛠️ Tests de performance

But : Vérifier la rapidité et la stabilité du système sous différentes charges.

Exemple : Vérifier si une API supporte 1000 requêtes simultanées sans ralentissement.

🛠️ Tests de sécurité

But : Détecter les vulnérabilités potentielles dans l’application.

Exemple : Vérifier si un utilisateur peut accéder à des données sensibles sans authentification.

🛠️ Tests de régression

But : Vérifier que les nouvelles modifications ne cassent pas le code existant.

Exemple : Relancer tous les tests unitaires après une mise à jour importante.

3. Les bases des tests unitaires

Un test unitaire consiste à isoler une fonction, un module ou un composant et à vérifier qu’il retourne bien le résultat attendu.

Exemple avec Jest (framework de test pour JavaScript) :

// math.js
export function add(a, b) {
  return a + b;
}
// math.test.js
import { add } from "./math";

test("addition de deux nombres", () => {
  expect(add(2, 3)).toBe(5);
});

Si le test passe, la fonction fonctionne correctement.
Si le test échoue, une erreur est signalée avant même d’exécuter le code en production.

4. Mettre en place les tests unitaires dans un projet

📌 Installation de Jest pour un projet Node.js

npm install --save-dev jest

Ajoutez un script de test dans package.json :

{
  "scripts": {
    "test": "jest"
  }
}

Lancez les tests :

npm test

📌 Configuration Jest pour TypeScript

Si vous utilisez TypeScript, ajoutez :

npm install --save-dev ts-jest @types/jest

Puis, créez un fichier de configuration jest.config.js :

module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",
};

5. Mieux structurer ses tests

Pour organiser efficacement ses tests, il est recommandé de :

Respecter une structure claire (un fichier de test pour chaque module).
Utiliser des noms de tests explicites pour comprendre leur objectif.
Éviter les dépendances externes (mocking des API, des bases de données).
Vérifier les cas limites et gérer les erreurs.

Exemple de test avec un mock :

const fetchData = jest.fn(() => Promise.resolve({ data: "OK" }));

test("fetchData retourne les bonnes valeurs", async () => {
  const response = await fetchData();
  expect(response.data).toBe("OK");
});

6. Intégration des tests unitaires avec CI/CD

Lancer les tests automatiquement à chaque push garantit que le code est toujours stable.

Ajoutez un workflow GitHub Actions :

name: Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v18
      - run: npm install
      - run: npm test

Avec cette configuration, chaque push sur GitHub déclenchera les tests automatiquement.

7. Conclusion

Les tests unitaires sont un élément clé de la qualité du code, mais ils ne suffisent pas à eux seuls. Les tests d’intégration et les tests end-to-end complètent la stratégie de test pour garantir un logiciel robuste.