The Chromium Chronicle n. 2: Fighting Test Flakiness

Episodio 2: di Vasilii a Monaco (maggio 2019)
Puntate precedenti

I test irregolari sono un problema comune in Chrome. Influiscono sulla produttività di altri sviluppatori e vengono disattivati nel tempo. I test disattivati riducono la copertura dei test.

Fase di classificazione

I PROPRIETARI delle directory sono responsabili della correzione dei test instabili. Se hai ricevuto un bug relativo a un test instabile, dedica qualche minuto a commentare il problema. Se hai un test instabile precedente e non ti è chiaro cosa non ha funzionato, prova semplicemente a riattivarlo. Riassegna il bug il prima possibile se si tratta chiaramente di un problema in un altro componente. I proprietari del componente dovrebbero avere un giudizio migliore sull'errore,

Fase di debug

Alcuni flag della riga di comando sono utili per correggere i test instabili. Ad esempio, --enable-pixel-output-in-tests mostrerà l'effettiva UI del browser.

Avere strumenti di riserva se il debugger fa scomparire le irregolarità. È possibile che, nel debugger, il test non sia mai irregolare. In questo caso, possono essere utili le istruzioni di log o base::debug::StackTrace.

Cosa non fare

Tieni presente i motivi comuni degli errori di EXPECT__* oltre ai bug nel codice di produzione:

  • Aspettative errate (ad es. pagina protetta significa HTTPS; può invece essere un localhost).
  • Condizioni di gara a causa di test non in attesa dell'evento corretto.

[Non testare l'implementazione][non l'implementazione], ma il comportamento.

// It takes 2 round trips between the UI and the background thread to complete.
SyncWithTheStore();
SyncWithTheStore();
CheckTheStore();

I due viaggi di andata e ritorno potrebbero cambiare in tre in futuro, rendendo il test irregolare. Tuttavia, solo lo stato del negozio è pertinente. Utilizza invece un osservatore per il negozio.

Cosa non fare

Fai attenzione a schemi comuni come i seguenti:

Submit TestPasswordForm();
// Wait until things settle down.
RunLoop().RunUntilIdle();
CheckCredentialPromptVisible();

Uno snippet come quello sopra, tratto da un test del browser, è quasi certamente errato. Prima che venga visualizzata una UI, potrebbero verificarsi molti eventi in processi e thread diversi.

Cosa fare

Di seguito è riportata una correzione corretta:

SubmitTestPasswordForm();
WaitUntilCredentialPromptVisible();

La correzione riportata sopra è corretta partendo dal presupposto che WaitUntilCredentialPromptVisible() non controlla effettivamente l'interfaccia utente. I test del browser non devono dipendere da eventi dell'interfaccia utente esterni come "focus perso" o "finestra diventa in primo piano". Immagina un'implementazione in cui il prompt viene visualizzato solo quando la finestra del browser è attiva. Un'implementazione di questo tipo sarebbe corretta; tuttavia, controllare la finestra effettiva rende il test irregolare.

Fase post-correzione

Una volta risolto il test, eseguilo centinaia di volte localmente. Tieni d'occhio il portale Flakiness.