Você fez o merge do PR. O CI estava verde. O deploy terminou sem erros nos logs. Vinte minutos depois, chegam tickets de suporte: um endpoint de pagamento está retornando 500 para parte dos clientes, mas nada falhou no pipeline.
Essa é a lacuna que o teste canário fecha. Testes unitários e de integração validam o código contra cenários esperados. Eles não validam a nova versão contra produção real: tráfego real, banco real, configuração real e APIs de terceiros que podem ter mudado comportamento. Em um rollout canário, você libera a nova versão para uma pequena fração do tráfego, mede o comportamento e só aumenta a exposição se os sinais estiverem saudáveis.
Para APIs, não basta olhar dashboards. Você pode executar testes automatizados diretamente contra o canário, validar status HTTP, esquemas de resposta, dados de negócio e latência, e usar o resultado para promover ou reverter o rollout. Este guia mostra como montar esse fluxo com o Apidog e sua CLI dentro de um pipeline CI/CD.
O que é teste canário
O nome vem do canário usado em minas de carvão. O pássaro reagia a gases tóxicos antes dos humanos; se ele parasse de cantar, os mineiros saíam. Um lançamento canário aplica a mesma ideia: uma pequena amostra assume o risco primeiro para proteger o restante dos usuários.
Na prática, você executa duas versões do serviço ao mesmo tempo:
- Estável: versão atual de produção, atendendo a maior parte do tráfego.
- Canário: nova versão, atendendo uma pequena porcentagem inicial, como 1% a 5%.
Um balanceador de carga, service mesh ou ingress controller divide o tráfego entre as versões. Você compara o canário com a versão estável usando métricas como erro, latência e sinais de negócio. Se o canário estiver saudável, aumenta a fatia de tráfego. Se degradar, redireciona tudo de volta para a versão estável.
O teste canário é a parte ativa desse ciclo: em vez de esperar usuários reais encontrarem o bug, você dispara requisições controladas contra o canário e valida as respostas antes de ampliar o rollout.
Teste canário vs. testes que você já executa
Teste canário não substitui testes unitários, integração ou smoke tests. Ele entra no final da cadeia, quando a nova versão já está em infraestrutura real.
| Tipo de teste | Executado contra | Detecta | Não cobre bem |
|---|---|---|---|
| Testes unitários | Funções isoladas | Bugs de lógica | I/O real, rede, banco, serviços externos |
| Testes de integração | Componentes conectados | Contratos quebrados entre serviços | Diferenças reais de produção |
| Smoke tests | Build implantada | Falhas básicas de disponibilidade | Regressões sutis de comportamento |
| Teste canário | Release ativo em produção | Configuração incorreta, drift de ambiente, regressões de performance, falhas parciais | Bugs que só aparecem em escala total |
O valor do teste canário está em detectar falhas que ambientes pré-produção não reproduzem completamente:
- variável de ambiente ausente;
- pool de conexões configurado de forma diferente;
- índice existente no staging, mas ausente em produção;
- dependência downstream com comportamento diferente em autenticação real;
- latência que só aparece com tráfego real.
Se você quiser revisar a base de automação antes do canário, veja também o guia sobre como automatizar testes de API em CI/CD e a comparação entre teste de fumaça vs. teste de regressão.
O que medir em um canário
Um canário só funciona se você definir o que significa “saudável”. Evite comparar apenas com números absolutos. Compare o canário com a versão estável no mesmo período.
Monitore pelo menos estes sinais:
-
Taxa de erro: proporção de respostas
5xxe4xxinesperados, como aumento repentino de401após mudança em autenticação. -
Latência: principalmente
p95ep99. A média pode esconder a cauda lenta. -
Corretude da resposta: status
200não basta. Valide schema, campos obrigatórios e formato do payload. - Sinais de negócio: login concluído, checkout aprovado, item adicionado ao carrinho, pagamento autorizado.
Os três primeiros podem ser validados diretamente com testes de API automatizados. O quarto pode ser coberto com cenários de ponta a ponta que exercitam fluxos críticos.
Fluxo de teste canário passo a passo
Um rollout canário controlado por testes de API pode seguir este fluxo:
- Implante a nova versão como canário ao lado da versão estável.
- Direcione uma pequena fatia do tráfego para ela, por exemplo
5%. - Execute testes automatizados de API contra o endpoint canário.
- Aguarde um período curto de observação, ou “bake”.
- Verifique métricas de erro e latência.
- Se os testes passarem e as métricas estiverem dentro do limite, aumente o tráfego.
- Repita a rampa:
5% -> 25% -> 50% -> 100%. - Se algo falhar, execute rollback automático.
- Quando chegar a
100%, promova o canário como nova versão estável.
As partes mais importantes são:
- o conjunto de testes que valida comportamento real;
- o gate do pipeline que decide promover ou reverter.
Construindo o conjunto de testes no Apidog
Um teste canário útil não deve verificar apenas /health. Esse endpoint mostra que o processo está vivo, mas não prova que fluxos reais funcionam.
Monte cenários para os caminhos críticos da API. Em uma API de e-commerce, por exemplo:
-
Autenticar
POST /auth/login- Assert: status
200 - Extrair token da resposta para uma variável
-
Ler produtos
GET /products?limit=10- Enviar token no header
- Assert: status
200 - Assert: resposta é array
- Assert: cada item tem
id,nameeprice
-
Adicionar item ao carrinho
POST /cart- Enviar produto conhecido
- Assert: status
201 - Assert: total do carrinho corresponde ao esperado
-
Verificar estado
GET /cart- Assert: item adicionado está presente
No Apidog, você pode criar essas requisições como cenários de teste, encadear passos, reutilizar variáveis e adicionar asserções visualmente.
Para validação de contrato, use o schema OpenAPI já definido. Assim, uma resposta 200 com corpo incompatível falha o teste automaticamente. Para autenticação, extraia o token do passo de login e referencie a variável nas próximas requisições.
O mesmo cenário pode ser reutilizado em três contextos:
- manualmente, durante a criação;
- em agenda, como monitoramento sintético;
- via CLI, dentro do pipeline canário.
Executando testes pela linha de comando
Para usar o teste como gate de deploy, ele precisa rodar em modo headless no CI.
Instale a CLI do Apidog no agente de build:
npm install -g apidog-cli
Execute um cenário específico usando token de acesso, ID do cenário e ID do ambiente:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t "$CANARY_SCENARIO_ID" \
-e "$CANARY_ENV_ID" \
-r cli,html,junit
Flags úteis para canário:
-
-t, --test-scenario: executa um cenário específico por ID. -
-f, --test-scenario-folder: executa uma pasta inteira de cenários. -
-e, --environment: seleciona o ambiente. Use um ambiente cuja URL base aponte para o canário. -
-r, --reporters: define os relatórios.cliimprime no console,htmlgera relatório visual ejunitgera XML consumido por ferramentas de CI. -
-d, --iteration-data: executa o cenário uma vez para cada linha de um CSV ou JSON. -
--upload-report: envia o resumo da execução de volta para o Apidog.
A CLI retorna código diferente de zero quando uma asserção falha. Esse exit code é o gate do rollout: se o teste falhar, o pipeline falha e a promoção não acontece.
Para exemplos mais específicos de pipeline, veja como automatizar testes de API no GitHub Actions e o guia de integração com Jenkins.
Exemplo com GitHub Actions
Abaixo está um fluxo simplificado que:
- implanta o canário com
5%do tráfego; - executa testes de API;
- observa métricas por dois minutos;
- promove se tudo passar;
- reverte se qualquer etapa falhar.
name: canary-release
on:
push:
branches: [main]
jobs:
canary:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy canary (5% traffic)
run: ./deploy.sh --canary --weight 5
- name: Install Apidog CLI
run: npm install -g apidog-cli
- name: Test the canary
run: |
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t "$CANARY_SCENARIO_ID" \
-e "$CANARY_ENV_ID" \
-r cli,junit
env:
APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
CANARY_SCENARIO_ID: ${{ vars.CANARY_SCENARIO_ID }}
CANARY_ENV_ID: ${{ vars.CANARY_ENV_ID }}
- name: Bake and watch (2 min)
run: sleep 120 && ./check-metrics.sh --service canary --max-error-rate 1.0
- name: Promote canary to 100%
run: ./deploy.sh --promote
- name: Roll back on any failure
if: failure()
run: ./deploy.sh --rollback
O ponto importante é a ordem:
- primeiro, o canário recebe uma pequena fatia do tráfego;
- depois, os testes são executados contra esse canário;
- em seguida, o pipeline observa métricas por um período curto;
- só então a promoção acontece.
Mantenha CANARY_ENV_ID apontando para um ambiente do Apidog cuja URL base seja o endpoint canário. Para reutilizar o mesmo cenário como smoke test pós-deploy, troque apenas o ambiente para produção.
Como apontar os testes para o canário
Evite executar os testes contra a URL pública balanceada sem controle, porque a requisição pode cair na versão estável.
Use uma das abordagens abaixo:
# Opção 1: hostname dedicado
https://canary.api.example.com
# Opção 2: header usado pelo ingress/service mesh
X-Canary: true
# Opção 3: variável de ambiente no Apidog
BASE_URL=https://canary.api.example.com
O importante é garantir que todas as requisições do cenário atinjam a versão canário.
Erros comuns que tornam o canário inútil
Testar o endpoint errado
Se o teste acessa a URL pública balanceada, talvez ele nem execute contra o canário. Aponte explicitamente para o canário por hostname, header de roteamento ou ambiente dedicado.
Usar período de bake igual a zero
Alguns problemas aparecem apenas depois de alguns minutos: vazamento de memória, saturação de pool, cache crescendo, conexões presas. Execute os testes e observe métricas antes de promover.
Não automatizar rollback
Se alguém precisa perceber a falha e clicar em “reverter”, o canário ainda depende de resposta manual. Conecte o rollback ao status do pipeline e teste esse caminho.
Usar limites absolutos sem contexto
“Falhar se erro > 1%” pode ser ruim se a linha de base atual já estiver em 1,5%. Sempre que possível, compare o canário com a versão estável no mesmo período.
Validar apenas status HTTP
Um 200 OK com corpo malformado ainda quebra clientes. Valide schema, campos obrigatórios e valores esperados. Se você já trabalha com contratos, validar respostas contra o schema torna o teste canário muito mais forte.
Qual porcentagem usar e por quanto tempo?
Não existe um número universal, mas um padrão prático é:
- começar com
5%do tráfego; - aumentar para
25%, depois50%, depois100%; - executar os testes em cada etapa;
- manter alguns minutos de bake por etapa;
- adaptar a janela ao volume real de tráfego.
APIs de alto tráfego acumulam sinal rapidamente. Uma API de pagamentos com milhares de requisições por segundo pode gerar evidência suficiente em poucos minutos. Uma API administrativa com poucas requisições por hora precisa de uma janela maior ou de carga sintética para gerar sinal.
Onde o canário entra na estratégia de release
Teste canário combina bem com blue-green deployments e feature flags, mas eles resolvem problemas diferentes:
- Blue-green: troca todo o tráfego de um ambiente para outro. Rollback é rápido, mas a exposição não é gradual.
- Feature flags: habilitam ou desabilitam comportamento para grupos de usuários sem novo deploy.
- Canário: move tráfego real gradualmente e usa sinais ao vivo para decidir promoção ou rollback.
Uma estratégia madura pode usar os três:
- blue-green para troca de infraestrutura;
- canário para aumento gradual de tráfego;
- feature flags para controle granular de comportamento.
O ponto central é: nenhum deles elimina a necessidade de testar a versão em produção. Eles limitam quem é exposto enquanto você valida.
Checklist de implementação
Use este checklist para colocar o fluxo em prática:
- [ ] Criar ambiente no Apidog apontando para o endpoint canário.
- [ ] Criar cenário com endpoints críticos, não apenas
/health. - [ ] Adicionar asserções de status, schema e campos obrigatórios.
- [ ] Extrair e reutilizar tokens ou IDs entre passos.
- [ ] Configurar
APIDOG_ACCESS_TOKENcomo secret no CI. - [ ] Executar
apidog runno pipeline após direcionar tráfego ao canário. - [ ] Adicionar período de bake.
- [ ] Verificar métricas de erro e latência.
- [ ] Promover somente se testes e métricas passarem.
- [ ] Executar rollback automático em
failure().
O teste canário não é apenas uma ferramenta; é uma disciplina de release: implantar pequeno, testar com asserções reais, observar sinais e automatizar a decisão. Com o Apidog, você cria o cenário uma vez, executa pela CLI em qualquer pipeline e usa o código de saída para controlar o rollout.
Baixe o Apidog para criar seu primeiro cenário canário, aponte um ambiente para o endpoint canário e adicione uma etapa CLI ao pipeline. O próximo deploy ruim deve falhar para uma pequena fração de requisições, não para todos os usuários.
FAQ
Teste canário é o mesmo que deploy canário?
Não. Deploy canário é o mecanismo de lançamento: servir uma nova versão para uma pequena fatia do tráfego. Teste canário é a validação ativa durante essa janela, com requisições automatizadas e asserções sobre as respostas.
Preciso de service mesh para fazer teste canário?
Não. Service meshes como Istio ou Linkerd ajudam na divisão de tráfego, mas você também pode usar balanceador de carga, ingress controller com anotações de canário ou ponderação de DNS. O fluxo de teste e gate do pipeline continua o mesmo.
Qual a diferença para smoke testing pós-deploy?
Smoke tests geralmente rodam contra uma versão já implantada para todos. Testes canário rodam enquanto a nova versão atende apenas uma fração do tráfego e decidem se o rollout continua. As asserções podem ser parecidas; o momento e a consequência são diferentes.
Posso reutilizar meus testes de API existentes como testes canário?
Sim, se eles tiverem asserções reais. Aponte os cenários para um ambiente cuja URL base seja o canário e execute pela CLI. Revise apenas se os testes validam corpo de resposta, schema e dados esperados, não só status HTTP.
O que acontece quando um teste canário falha no CI?
A CLI do Apidog retorna código diferente de zero quando alguma asserção falha. O pipeline trata isso como falha: a promoção é interrompida e a etapa de rollback configurada com if: failure() é executada.

Top comments (0)