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é :
- Arrange (Préparation) : Création de variables, initialisation d'objets, configuration de données de test, préparation de l'environnement ou de bouchons ().
- Act (Action) : Appel de la méthode ou fonction testée et sauvegarde de la valeur retournée dans une variable.
- 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)ouit(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).
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', () => { ... });
``