Vai al contenuto
SDETRole
SDETRole

Glossario · CI/CD e DevOps

Feature flag

Detto anche: feature flags, feature toggle, feature toggles, flag di funzionalità

Definizione

Un interruttore a runtime che attiva o disattiva un percorso di codice senza deploy, per rilasciare lavoro nascosto, distribuirlo per gradi e annullarlo in fretta.

Un feature flag (o feature toggle) è una condizione nel codice il cui valore arriva dalla configurazione a runtime: se il flag è attivo per questo utente o ambiente, si segue il nuovo percorso, altrimenti quello vecchio. Separa il deploy del codice dal rilascio di una funzionalità. Il codice può stare in produzione disattivato, poi essere abilitato per gli utenti interni, poi per il 10% dei clienti, poi per tutti, e venire disattivato di nuovo in pochi secondi se qualcosa va storto.

Esempio

if (flags.isEnabled('new-checkout', { userId: user.id })) {
  return renderNewCheckout(cart);
}
return renderLegacyCheckout(cart);

Il servizio di flag (un prodotto commerciale, uno open source o una tabella nel tuo database) decide il valore per ogni utente, spesso in base a una percentuale o a un attributo.

Cosa significa per il testing

Ogni flag raddoppia il numero di percorsi possibili attraverso quella parte di codice. Un tester deve sapere:

  • Quali stati dei flag vengono rilasciati insieme. Testa la combinazione che sarà effettivamente attiva in produzione, non solo “tutto acceso”.
  • Entrambi i lati di ogni flag attivo. Il vecchio percorso resta codice di produzione finché il flag non viene rimosso, quindi le suite di regressione devono coprirlo.
  • Il cambio di stato in sé. Attivare o disattivare il flag a metà sessione non deve corrompere i dati né lasciare un utente bloccato a metà di un flusso.
  • Il controllo nei test. I test automatizzati devono impostare esplicitamente i valori dei flag, per esempio tramite un’API riservata ai test, un cookie o un override di configurazione, invece di dipendere da ciò che l’ambiente condiviso ha in quel momento. Altrimenti qualcuno che cambia un flag rompe esecuzioni di test non correlate, cosa che sembra in tutto e per tutto instabilità (flakiness).
test('new checkout shows delivery slots', async ({ page, context }) => {
  await context.addCookies([
    { name: 'ff_new-checkout', value: 'on', url: 'https://staging.example.com' },
  ]);
  await page.goto('https://staging.example.com/checkout');
  await expect(page.getByRole('heading', { name: 'Choose a delivery slot' })).toBeVisible();
});

Il nome del cookie qui è solo un esempio; usa il meccanismo di override che il tuo sistema di flag mette a disposizione.

Errori comuni

I flag che non vengono mai rimossi sono il principale costo a lungo termine: rami morti, combinazioni che nessuno capisce e vecchi percorsi che si degradano in silenzio. Tratta ogni flag di rilascio come temporaneo, con un responsabile e una data di rimozione, ed elimina il ramo perdente e i suoi test una volta completato il rollout.

Scrivi per cercare in tutto SDETRole.

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