Vai al contenuto
SDETRole
SDETRole

Glossario · Automazione della UI

Test fixture

Detto anche: fixture, fixture di test, test fixtures, setup e teardown

Definizione

La preparazione fissa di cui un test ha bisogno prima di partire, come una pagina del browser, un utente precaricato o un database, più il teardown che poi fa pulizia.

Una test fixture è tutto ciò da cui un test dipende e che non è il comportamento sotto test: gli oggetti, i dati, le connessioni e l’ambiente che devono trovarsi in uno stato noto prima che venga eseguito il primo passo. Una buona fixture prepara quello stato sempre allo stesso modo e lo smonta alla fine (teardown), così ogni test parte da zero. Il termine si usa anche in senso più ampio per i file di dati di test statici, come i file JSON che Cypress carica con cy.fixture().

Esempio (Playwright)

In Playwright le fixture sono una funzionalità di primo piano. Quelle integrate, come page e request, vengono iniettate per nome, e puoi aggiungere le tue con test.extend:

import { test as base, expect } from '@playwright/test';
import { TodoPage } from './todo-page';

type Fixtures = { todoPage: TodoPage };

export const test = base.extend<Fixtures>({
  todoPage: async ({ page }, use) => {
    const todoPage = new TodoPage(page);   // setup
    await todoPage.goto();
    await use(todoPage);                   // the test runs here
    await todoPage.removeAll();            // teardown
  },
});

test('adds an item', async ({ todoPage }) => {
  await todoPage.add('Write the glossary');
  await expect(todoPage.items).toHaveCount(1);
});

Le fixture vengono create solo quando un test le richiede, possono dipendere da altre fixture e possono avere scope per singolo test (predefinito) o per worker con { scope: 'worker' }, utile per le risorse costose.

Esempio (JUnit 5)

Nei framework in stile xUnit la fixture vive nei metodi del ciclo di vita:

class CartServiceTest {
    private CartService cart;

    @BeforeEach
    void setUp() {
        cart = new CartService(new InMemoryCartRepository());
    }

    @AfterEach
    void tearDown() {
        cart.clear();
    }

    @Test
    void emptyCartHasZeroTotal() {
        assertEquals(0, cart.total());
    }
}

@BeforeAll e @AfterAll vengono eseguiti una volta per classe e per impostazione predefinita devono essere static.

Errori comuni

  • Condividere tra i test uno stato mutabile della fixture. Un utente con scope di worker che i test modificano causerà fallimenti che dipendono dall’ordine di esecuzione.
  • Saltare il teardown quando un test fallisce. Metti la pulizia nella fixture (dopo use) o in @AfterEach, non alla fine del corpo del test.
  • Un’unica fixture gigante per tutto. Fixture piccole e componibili rendono evidente da cosa dipende ciascun test.

Scrivi per cercare in tutto SDETRole.

Ricerca full-text con Pagefind · funziona nel tuo browser Apri la pagina di ricerca →