React

Coverage utile: la soglia che ha senso

La coverage conta righe eseguite, non righe verificate. Una soglia utile parte da 80% sulle righe e 70% sui rami, misurata per cartella e non sul totale.

In sintesi

  • La percentuale conta righe eseguite: un test senza assert la alza senza verificare niente.
  • La soglia va per cartella: il totale nasconde il modulo con zero test.
  • 80% righe e 70% rami coprono il codice che decide il comportamento; oltre si inseguono getter.

La coverage misura righe eseguite, non righe verificate: un test senza assert alza la percentuale e non prova niente. La soglia utile va messa per cartella, non sul totale del progetto.

Cosa misura il numero

Il provider v8 di Vitest, con licenza MIT, legge i contatori del motore JavaScript e riporta quattro valori: righe, rami, funzioni e istruzioni. Nessuno dei quattro guarda gli assert.

La configurazione che regge

// vitest.config.ts
import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    coverage: {
      provider: "v8",
      reporter: ["text", "json-summary"],
      thresholds: { lines: 80, branches: 70, functions: 80, statements: 80 },
    },
  },
});

Le soglie fanno fallire il comando, non solo stampare un numero: è questa la differenza fra una metrica e un contratto. Su un monorepo conviene aggiungere una soglia per cartella con perFile.

Il comando

npm i -D vitest @vitest/coverage-v8
npx vitest run --coverage

Il pacchetto @vitest/coverage-v8 è MIT e usa i contatori già presenti in Node: nessun servizio esterno, nessun upload, il report resta in CI.

Tre record con rami veri da coprire: filters, data-table e progress-indicator. Per esplorare per categoria parti da 111.985 componenti.

La limitazione

La coverage non vede la qualità degli assert: un file al 100% può non verificare nulla. Non misura nemmeno il codice che non esiste ancora, cioè i casi limite che nessuno ha scritto: quelli si trovano leggendo il componente, non il report.

Dove continuare

Il modello di test è in Testing Library: cinque test; le doppie chiamate che gonfiano i contatori sono in StrictMode; il confronto fra framework è in framework frontend a confronto; il profilo di rendering è in React Profiler.

Domande frequenti

Quale soglia di coverage conviene?

80% sulle righe e 70% sui rami per cartella. Sotto resta codice importante scoperto, sopra si inseguono getter e costanti.

Coverage al 100% vuol dire zero bug?

No. Vuol dire che ogni riga è stata eseguita almeno una volta, non che un assert ne abbia controllato il risultato.

Misuro le righe o i rami?

I rami, quando devi scegliere. Un <code>if</code> coperto solo sul caso vero resta per metà non testato.

La coverage rallenta la CI?

Poco. Il provider v8 riusa i contatori del motore, quindi il costo è quasi tutto la scrittura del report.

Il report va pubblicato?

No, se contiene percorsi interni. Serve al team nella pipeline; online si pubblica al massimo il numero per cartella.