Glossário · CI/CD e DevOps
Feature flag
Também chamado de: feature flags, feature toggle, feature toggles, flag de funcionalidade
Definição
Um interruptor em tempo de execução que liga ou desliga um trecho de código sem deploy, permitindo publicar trabalho inacabado desligado, liberar aos poucos e reverter rápido.
Uma feature flag (ou feature toggle) é uma condição no código cujo valor vem da configuração em tempo de execução: se a flag estiver ligada para este usuário ou ambiente, segue o caminho novo; caso contrário, o antigo. Ela separa o deploy do código do release de uma funcionalidade. O código pode ficar em produção desligado, depois ser habilitado para usuários internos, depois para 10% dos clientes, depois para todos, e ser desligado de novo em segundos se algo der errado.
Exemplo
if (flags.isEnabled('new-checkout', { userId: user.id })) {
return renderNewCheckout(cart);
}
return renderLegacyCheckout(cart);
O serviço de flags (um produto comercial, um open source ou uma tabela no seu próprio banco de dados) decide o valor por usuário, muitas vezes por percentual ou por atributo.
O que isso significa para os testes
Cada flag dobra o número de caminhos possíveis por aquele trecho de código. O tester precisa saber:
- Quais estados de flag vão juntos para produção. Teste a combinação que realmente vai estar ativa em produção, e não só “tudo ligado”.
- Os dois lados de cada flag ativa. O caminho antigo continua sendo código de produção até a flag ser removida, então as suítes de regressão precisam cobri-lo.
- A própria troca. Ligar ou desligar a flag no meio de uma sessão não deve corromper dados nem deixar um usuário preso no meio de um fluxo.
- Controle nos testes. Testes automatizados devem definir os valores das flags explicitamente, por exemplo por uma API exclusiva de teste, um cookie ou um override de configuração, em vez de depender do que o ambiente compartilhado tiver no momento. Caso contrário, alguém trocando uma flag quebra execuções de testes que não têm nada a ver com ela, o que parece exatamente 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();
});
O nome do cookie aqui é só ilustrativo; use o mecanismo de override que o seu sistema de flags oferecer.
Erros comuns
Flags que nunca são removidas são o principal custo a longo prazo: branches mortas, combinações que ninguém entende e caminhos antigos que apodrecem em silêncio. Trate cada flag de release como temporária, com um responsável e uma data de remoção, e apague o lado perdedor e os testes dele assim que o rollout terminar.