Organiser ses tests Jest avec describe et test pour une meilleure lisibilité
Introduction
La qualité des tests ne se mesure pas seulement à leur couverture, mais aussi à leur lisibilité et leur structure. Bien organiser ses tests permet de les comprendre rapidement et de les maintenir facilement.
Cet article montre comment utiliser `describe` et `test` pour structurer vos suites de tests de manière claire et logique.
1. Les bases de la structure de test
Dans Jest, deux fonctions principales aident à organiser vos tests : `describe` pour regrouper des tests liés, et `test` (ou son alias `it`) pour définir un cas de test spécifique.
describe('Calculatrice', () => {
test('addition de deux nombres', () => {
expect(2 + 2).toBe(4);
});
test('soustraction de deux nombres', () => {
expect(5 - 3).toBe(2);
});
});
2. Imbrication des groupes de tests
Vous pouvez imbriquer des blocs `describe` pour créer une hiérarchie de tests plus détaillée et organisée.
describe('Utilisateur', () => {
describe('Validation', () => {
test('nom valide', () => {
// Test de validation du nom
});
test('email invalide', () => {
// Test de validation de l'email
});
});
describe('Authentification', () => {
test('connexion réussie', () => {
// Test de connexion
});
});
});
3. Tests conditionnels et regroupement
Vous pouvez conditionner des groupes de tests entiers ou des tests individuels en fonction de certaines conditions, ce qui permet une organisation plus dynamique.
const environnementProd = process.env.NODE_ENV === 'production';
// Test uniquement en environnement de production
environnementProd && describe('Tests de production', () => {
test('configuration sécurisée', () => {
expect(processus.env.SECURITE).toBeDefined();
});
});
// Test conditionnel
describe('Fonctionnalités avancées', () => {
(process.env.FONCTIONNALITE_ACTIVEE === 'true') && test('nouvelle fonctionnalité', () => {
// Test de la nouvelle fonctionnalité
});
});
4. Bonnes pratiques
- Nommer clairement vos groupes et tests
- Tester un seul comportement par test
- Garder les tests indépendants les uns des autres
- Utiliser des noms de test descriptifs
Exemple complet : Test d'un composant React
import { render, fireEvent } from '@testing-library/react';
describe('Formulaire de Contact', () => {
describe('Validation', () => {
test('affiche une erreur si le nom est vide', () => {
const { getByText, getByTestId } = render(<Formulaire />);
const submitButton = getByText('Envoyer');
fireEvent.click(submitButton);
expect(getByText('Le nom est requis')).toBeInTheDocument();
});
test('soumet le formulaire si valide', () => {
const { getByTestId, queryByText } = render(<Formulaire />);
fireEvent.change(getByTestId('nom-input'), { target: { value: 'Jean' } });
fireEvent.change(getByTestId('email-input'), { target: { value: 'jean@exemple.com' } });
fireEvent.click(getByText('Envoyer'));
expect(queryByText('Le nom est requis')).not.toBeInTheDocument();
});
});
});
Conclusion
Bien structurer vos tests vous fait gagner du temps. Des tests clairs et organisés facilitent la compréhension, la maintenance et l'évolution de votre code.