Glossario · Automazione della UI
Isolamento dei test
In inglese: Test isolation
Detto anche: test isolati, indipendenza dei test, test indipendenti
Definizione
Proprietà per cui ogni test prepara il proprio stato e può passare da solo, in qualsiasi ordine e in parallelo, senza dipendere da altri test né influenzarli.
Un test isolato crea tutto ciò di cui ha bisogno, non si affida a nulla di ciò che un altro test ha lasciato e non lascia nulla che cambi il risultato di un altro test. Se puoi eseguire qualsiasi test da solo, eseguire l’intera suite in ordine inverso o eseguirla su otto worker in parallelo ottenendo sempre gli stessi risultati, la suite è isolata. È l’isolamento a rendere sicuri l’esecuzione parallela e lo sharding.
Esempio
Non isolato: il secondo test dipende dal primo.
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
});
Isolato: ogni test crea i propri dati, con un nome univoco, tramite 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 aiuta a livello di browser: ogni test riceve un BrowserContext nuovo, quindi cookie, local storage e sessioni non passano mai da un test all’altro.
Fonti di contaminazione
- Account e record condivisi che i test modificano, come un unico “utente di test” le cui impostazioni vengono cambiate da ogni test.
- Stato statico o globale nel codice di test, come un driver singleton o una variabile a livello di classe.
- Righe del database senza pulizia, o test che verificano il numero di righe di una tabella in cui scrivono anche altri test.
- Stato esterno come feature flag, caselle email, orario e cache.
Come verificarlo
Esegui i test in ordine casuale. JUnit 5 supporta @TestMethodOrder(MethodOrderer.Random.class) e in junit-platform.properties si può impostare un ordine casuale predefinito per ogni classe. Esegui i singoli test da soli. Esegui la suite con più worker del solito. Qualsiasi test il cui risultato cambia non è isolato.
L’isolamento completo ha un costo, soprattutto quando il setup è lento. Un compromesso comune è condividere per worker i dati costosi e in sola lettura, mantenendo univoco per ciascun test tutto ciò che il test scrive.