Aller au contenu
SDETRole
SDETRole

Glossaire · Automatisation de l’UI

Isolation des tests

En anglais : Test isolation

Également appelé : tests isolés, indépendance des tests, tests indépendants, isolated tests

Définition

Propriété selon laquelle chaque test prépare son propre état et peut réussir seul, dans n'importe quel ordre et en parallèle, sans dépendre des autres tests ni les affecter.

Un test isolé crée tout ce dont il a besoin, ne compte sur rien de ce qu’un autre test a laissé derrière lui et ne laisse rien qui modifie le résultat d’un autre test. Si vous pouvez exécuter n’importe quel test seul, lancer toute la suite dans l’ordre inverse ou la répartir sur huit workers parallèles et obtenir les mêmes résultats, la suite est isolée. C’est l’isolation qui rend l’exécution parallèle et le sharding sûrs.

Exemple

Non isolé : le second test dépend du premier.

test('creates a project', async ({ page }) => {
  await page.goto('/projects/new');
  await page.getByLabel('Name').fill('Apollo');
  await page.getByRole('button', { name: 'Create' }).click();
});

test('renames the project', async ({ page }) => {
  await page.goto('/projects/apollo'); // fails if run alone or first
});

Isolé : chaque test crée ses propres données, avec un nom unique, via l’API.

test('renames a project', async ({ page, request }) => {
  const name = `proj-${crypto.randomUUID()}`;
  const res = await request.post('/api/projects', { data: { name } });
  const { id } = await res.json();

  await page.goto(`/projects/${id}`);
  // ...rename and assert
});

Playwright aide au niveau du navigateur : chaque test reçoit un BrowserContext neuf, si bien que cookies, local storage et sessions ne fuient jamais d’un test à l’autre.

Sources de fuite

  • Des comptes et enregistrements partagés que les tests modifient, comme un unique « utilisateur de test » dont chaque test change les paramètres.
  • Un état statique ou global dans le code de test, comme un driver singleton ou une variable de classe.
  • Des lignes en base sans nettoyage, ou des tests qui vérifient le nombre de lignes d’une table dans laquelle d’autres tests écrivent aussi.
  • Un état externe comme les feature flags, les boîtes mail, l’heure et les caches.

Comment vérifier

Exécutez les tests dans un ordre aléatoire. JUnit 5 prend en charge @TestMethodOrder(MethodOrderer.Random.class), et un ordre aléatoire par défaut pour toutes les classes peut être défini dans junit-platform.properties. Exécutez des tests isolément. Lancez la suite avec plus de workers que d’habitude. Tout test dont le résultat change n’est pas isolé.

Une isolation totale a un coût, surtout quand la mise en place est lente. Un compromis courant consiste à partager par worker les données coûteuses et en lecture seule, tout en gardant unique à chaque test tout ce qu’il écrit.

Saisissez un terme pour rechercher sur SDETRole.

Recherche plein texte par Pagefind · s’exécute dans votre navigateur Ouvrir la page de recherche →