Comment est structuré un test ? De la structure aux vérifications

Tout test automatisé professionnel doit être facile à lire et prévisible. Pour organiser la structure des tests, l'industrie a adopté le standard. Décomposons ce pattern et apprenons à structurer les fichiers de tests avec Vitest ou Jest.

1.

La division du test en trois phases claires aide tout développeur à comprendre instantanément ce qui est configuré, quelle action est effectuée et ce qui est vérifié :

  1. Arrange (Préparation) : Création de variables, initialisation d'objets, configuration de données de test, préparation de l'environnement ou de bouchons ().
  2. Act (Action) : Appel de la méthode ou fonction testée et sauvegarde de la valeur retournée dans une variable.
  3. Assert (Vérification) : Comparaison de la valeur obtenue avec le résultat attendu. Si elles correspondent — le test passe, sinon il échoue.

Exemple sur du code réel (Vitest)

Imaginons une fonction simple de calcul du prix d'un produit avec remise :

const calculatePrice = (price, discount = 0) => price - price * discount;

Voici à quoi ressemblerait le test pour elle selon le pattern AAA :

import { describe, test, expect } from 'vitest';

describe('Fonction calculatePrice()', () => {
    test('applique correctement la remise au prix du produit', () => {
        // 1. Arrange (Préparation des données)
        const initialPrice = 1000;
        const discountRate = 0.1; // 10% de remise
        const expectedFinalPrice = 900;

        // 2. Act (Exécution de l'action)
        const actualPrice = calculatePrice(initialPrice, discountRate);

        // 3. Assert (Comparaison des résultats)
        expect(actualPrice).toBe(expectedFinalPrice);
    });
});

2. Blocs principaux du framework de test

Dans les outils de test modernes (Vitest, Jest), la structure du fichier est construite à l'aide de fonctions globales :

  • describe(name, fn) (Groupe de tests) : Regroupe des cas de test logiquement liés en un groupe commun (). Par exemple, on peut regrouper tous les tests pour le module panier : describe('Panier utilisateur', () => { ... }).
  • test(name, fn) ou it(name, fn) (Cas de test) : Le test lui-même. Le nom du test doit décrire clairement le comportement attendu en langage clair. Il est recommandé d'utiliser le style des phrases : « doit retourner null si un email invalide est passé ».
  • expect(actualValue) (Assertion) : Prend la valeur réelle obtenue de votre code et fournit l'accès à la chaîne de comparaisons (matchers).
Astuce

L'utilisation de it (de l'anglais « it should... ») rend la lecture des tests encore plus naturelle :

it('should return zero when input is negative', () => { ... });
``