Seus testes de API são aprovados em cada pull request. A compilação está verde. Você implanta. Então, às 9 da manhã, alguém em outro fuso horário relata que o checkout retorna um erro 500, e ninguém alterou o código do checkout. O que mudou foi um sandbox de pagamento de terceiros, uma migração de banco de dados que rodou durante a noite, ou um token que expirou silenciosamente. Seus testes por commit nunca detectaram isso porque nada no seu repositório se moveu.
Esta é a lacuna que uma compilação noturna fecha. Uma compilação noturna é uma execução de teste completa e agendada que dispara uma vez por dia, geralmente nas primeiras horas da manhã, contra seus serviços e ambientes reais, em vez de apenas em alterações de código. Ela detecta as falhas que existem entre os commits: desvio de dados, integrações instáveis, credenciais expiradas, vazamentos lentos de desempenho e quebras de contrato introduzidas por serviços que você não controla. Para APIs especificamente, uma execução de regressão noturna é o sistema de alerta antecipado mais barato que você pode configurar.
Este guia descreve a construção desse sistema de ponta a ponta com Apidog. Você projetará um conjunto de regressão, gerará uma execução de linha de comando com o Apidog CLI, o conectará a um trabalho de CI agendado no GitHub Actions, GitLab e Jenkins, e terá um relatório esperando por você antes da reunião de standup. Se você já depurou uma interrupção que uma execução noturna teria sinalizado horas antes, este é o fluxo de trabalho que recupera essas horas.
Por que testes por commit não são suficientes
A integração contínua nos ensinou a testar a cada push. Isso é bom, e você deve continuar fazendo isso. Mas os testes por commit respondem a uma pergunta restrita: "essa mudança quebrou algo?" Eles são rápidos, executados frequentemente e têm um escopo para manter os desenvolvedores desbloqueados. Esse escopo é exatamente o motivo pelo qual eles perdem uma classe inteira de problemas.
Uma compilação noturna responde a uma pergunta mais ampla: "o sistema ainda está saudável agora, independentemente de alguém ter mexido nele?" A diferença importa porque a produção tem partes móveis que seus commits nunca veem.
- Desvio de dependências externas. Um provedor de pagamento rotaciona uma chave de sandbox. Uma API de clima deprecia um campo. Seu código é idêntico, mas o contrato mudou sob você.
- Mudanças de dados sem código. Trabalhos ETL noturnos, migrações agendadas e atualizações de conteúdo podem colocar seu banco de dados em um estado que seus testes rápidos nunca exercitam.
- Tokens e certificados expiram. Tokens de atualização OAuth, certificados TLS e chaves de API têm ciclos de vida. No dia em que um expira, sua compilação verde é uma mentira.
- Regressões lentas se escondem em suites rápidas. Uma consulta que passa de 200 ms para 1.2 s não falhará em uma asserção funcional, mas uma execução noturna com um limite de tempo de resposta sim.
- Suites completas são muito lentas para cada push. A execução abrangente de 400 casos que atinge cada endpoint, cada caso de borda e cada ambiente é muito pesada para barrar um pull request. O noturno é onde ela pertence.
Então, o padrão é de dois níveis, não "ou/ou". Testes de fumaça rápidos guardam cada commit. Um conjunto de regressão mais profundo é executado em um cronograma. O nível noturno é onde você coloca tudo o que é muito lento, muito amplo ou muito dependente do mundo real para pertencer ao ciclo interno.
O que entra em um conjunto de regressão de API noturno
Antes de agendar qualquer coisa, decida o que a execução noturna realmente verifica. Um conjunto noturno é mais amplo do que seus testes de fumaça de commit-gate e mais completo do que um rápido ping de saúde. Busque uma cobertura que o envergonharia se falhasse silenciosamente.
Um sólido conjunto de API noturno cobre:
- Jornadas críticas do usuário, de ponta a ponta. Não apenas endpoints isolados; as cadeias reais. Cadastrar, fazer login, criar um recurso, lê-lo de volta, atualizá-lo, excluí-lo. Cada etapa passando tokens e IDs para a próxima.
- Autenticação e autorização. Login válido, rejeição de token expirado, acesso baseado em função. A autenticação é o assassino silencioso; teste-a todas as noites.
- Conformidade de contrato. Cada resposta validada contra seu esquema OpenAPI para que um backend que silenciosamente descarta um campo ou altera um tipo seja detectado. Se sua documentação e suas respostas tendem a divergir, esta é a verificação que detecta isso. (Veja por que a documentação e as coleções do Swagger continuam divergindo para entender a mecânica.)
- Casos de limite e erro. 400s em entradas inválidas, 404s em recursos ausentes, 429s sob limites de taxa, 401s sem credenciais. Os caminhos infelizes quebram com mais frequência do que os felizes.
- Integridade dos dados entre solicitações. Crie algo e, em seguida, confirme que uma solicitação posterior o vê. Capture bugs de consistência eventual e de cache.
- Limites de desempenho. Afirme que os endpoints chave respondem dentro de um orçamento. Uma linha de tendência noturna mostra o aumento antes que se torne um incidente.
Se você nunca escreveu casos estruturados como estes, o modelo e exemplo de caso de teste de API é um bom ponto de partida, e asserções de API cobre como validar o corpo da resposta, status, cabeçalhos e tempo com precisão.
Passo 1: Construa o conjunto de regressão no Apidog
O Apidog trata os testes como uma parte de primeira classe do ciclo de vida da API, não como um complemento. Você projeta endpoints e, em seguida, os encadeia em cenários de teste que espelham fluxos de trabalho reais. Um cenário é uma lista ordenada de etapas onde cada etapa é uma solicitação de API com asserções, e onde os dados fluem de uma etapa para a próxima.
Aqui está a forma de um cenário de regressão de checkout:
- POST /auth/login: envie credenciais, afirme
200, extraia oaccessTokenda resposta para uma variável. - POST /carts: crie um carrinho usando o token, afirme
201, extraia ocartId. - POST /carts/{cartId}/items: adicione um produto, afirme
200, afirme que ototaldo corpo da resposta é igual ao preço esperado. - POST /checkout: envie o carrinho, afirme
200, afirme queorder.statusé"confirmed". - GET /orders/{orderId}: leia o pedido de volta, afirme que ele persistiu com os itens de linha corretos.
No Apidog, você constrói isso visualmente. Cada etapa recebe asserções sem escrever código repetitivo: uma asserção visual como "o status da resposta é 200" ou "JSONPath $.order.status é igual a confirmado." Para conformidade de esquema, o Apidog pode validar a resposta em relação à definição OpenAPI salva do endpoint automaticamente, para que você não precise escrever manualmente uma verificação para cada campo.
Algumas regras de design mantêm um conjunto noturno sustentável:
- Use ambientes, não URLs hardcoded. Defina um ambiente de
stagingcom sua URL base, credenciais e variáveis. O mesmo cenário é executado contra o staging hoje à noite e contra um release candidate na próxima semana, trocando uma única flag. - Parametrize com variáveis. Obtenha o nome de usuário de teste, URL base e quaisquer IDs de variáveis de ambiente para que nada secreto ou específico do ambiente viva no próprio cenário.
- Agrupe cenários em um conjunto de testes. Um conjunto de testes agrupa muitos cenários para que um único comando os execute todos. Essa é a unidade que você agendará.
Se você vem de outra ferramenta, isso se alinha perfeitamente com conceitos que você já conhece. A visão mais ampla de como encadear cenários está no guia de orquestração de testes de API, e se você nunca executou um teste estruturado no Apidog antes, como testar uma API com Apidog é o ponto de partida passo a passo. Baixe o Apidog e construa um cenário antes de continuar lendo; o restante deste guia assume que você tem um conjunto para executar.
Passo 2: Execute o conjunto a partir da linha de comando
Uma compilação noturna é executada sem supervisão, então precisa de um executor headless. Esse é o Apidog CLI, um pacote npm que executa seus cenários de teste salvos a partir de qualquer terminal, sem necessidade de GUI. Ele foi construído exatamente para isso: execuções automatizadas dentro de um pipeline de CI/CD.
Instale-o globalmente. O CLI precisa do Node.js v16 ou superior.
npm install -g apidog-cli
Para executar um cenário online (um que vive no seu projeto Apidog), você precisa de duas coisas: um token de acesso e o ID do cenário ou conjunto. Gere o token no Apidog em Configurações de CI/CD, onde há um botão "Adicionar token de acesso". Trate esse token como uma senha; ele deve ir em um segredo, nunca no seu repositório.
O comando para executar um único cenário de teste se parece com isto:
apidog run \
--access-token $APIDOG_ACCESS_TOKEN \
-t 123456 \
-e 789 \
-r cli,html \
--out-dir ./apidog-reports
Flag por flag, usando as opções reais do Apidog CLI:
--access-token <token>autentica a execução. Passe-o a partir de uma variável de ambiente.-t, --test-scenario <id>seleciona o cenário a ser executado. Para executar um conjunto completo, use--test-suite <id>; para executar uma pasta de cenários, use-f, --test-scenario-folder <id>.-e, --environment <id>seleciona o ambiente (staging, somente leitura de produção, etc.).-r, --reporters [reporters]define o formato de saída.cliimprime os resultados no console para seus logs de CI;htmlproduz um arquivo de relatório compartilhável.--out-dir <dir>é onde o relatório HTML é salvo para que o CI possa arquivá-lo como um artefato.
Outras flags ganham seu lugar em uma execução noturna. -n, --iteration-count <n> repete a execução para identificar instabilidade. -d, --iteration-data <path> alimenta um arquivo CSV ou JSON para que um cenário seja executado em muitas linhas de dados; perfeito para testes de limite. --env-var "key=value" e --global-var "key=value" injetam valores em tempo de execução, que é como você mantém as credenciais fora do cenário salvo.
Você não precisa memorizar isso. O Apidog gera o comando exato para você: abra o painel de CI/CD no cliente, escolha seu cenário ou conjunto e copie a linha apidog run pronta diretamente para a configuração do seu pipeline. Execute-o uma vez localmente primeiro para confirmar que está verde antes de agendá-lo.
Passo 3: Agende-o como uma compilação noturna
Uma compilação noturna é este comando em um temporizador. Cada plataforma de CI suporta trabalhos agendados através da sintaxe cron. O padrão é idêntico em todas elas: um gatilho diário, o token de acesso de um segredo, a execução do CLI e o relatório arquivado como um artefato.
GitHub Actions
O GitHub Actions suporta um gatilho schedule com cron padrão. Este fluxo de trabalho é executado às 02:00 UTC todos os dias e também expõe um botão manual via workflow_dispatch.
name: Nightly API Regression
on:
schedule:
- cron: '0 2 * * *' # 02:00 UTC daily
workflow_dispatch: # allow manual runs
jobs:
regression:
runs-on: ubuntu-latest
steps:
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Apidog CLI
run: npm install -g apidog-cli
- name: Run nightly regression suite
run: |
apidog run \
--access-token $APIDOG_ACCESS_TOKEN \
--test-suite ${{ vars.APIDOG_SUITE_ID }} \
-e ${{ vars.APIDOG_ENV_ID }} \
-r cli,html \
--out-dir ./apidog-reports
env:
APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
- name: Upload HTML report
if: always()
uses: actions/upload-artifact@v4
with:
name: apidog-nightly-report
path: ./apidog-reports
O if: always() na etapa de upload é importante: você quer que o relatório seja arquivado mesmo quando a execução falha, porque uma falha é exatamente quando você precisa lê-lo. Observe que os trabalhos agendados do GitHub são executados em UTC e podem ser atrasados durante o pico de carga, então não agende nada que precise ser disparado em um segundo exato.

GitLab CI/CD
O GitLab agenda pipelines através da UI (CI/CD > Agendamentos) em vez de no YAML, então seu trabalho é acionado por uma condição de regras para que ele seja executado apenas no agendamento, e não em cada push.
nightly-regression:
image: node:20
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
before_script:
- npm install -g apidog-cli
script:
- apidog run
--access-token "$APIDOG_ACCESS_TOKEN"
--test-suite "$APIDOG_SUITE_ID"
-e "$APIDOG_ENV_ID"
-r cli,html
--out-dir ./apidog-reports
artifacts:
when: always
paths:
- apidog-reports/
expire_in: 30 days
Defina APIDOG_ACCESS_TOKEN como uma variável de CI/CD mascarada e protegida, e então crie um agendamento de pipeline com uma expressão cron como 0 2 * * *. O bloco rules impede que este trabalho seja executado em commits comuns.

Jenkins
No Jenkins, um pipeline com um gatilho cron faz o mesmo trabalho. Armazene o token como uma credencial e puxe-o com withCredentials.
pipeline {
agent any
triggers {
cron('H 2 * * *') // around 02:00, H spreads load
}
stages {
stage('Install CLI') {
steps { sh 'npm install -g apidog-cli' }
}
stage('Nightly regression') {
steps {
withCredentials([string(credentialsId: 'apidog-token',
variable: 'APIDOG_ACCESS_TOKEN')]) {
sh '''
apidog run \
--access-token $APIDOG_ACCESS_TOKEN \
--test-suite $APIDOG_SUITE_ID \
-e $APIDOG_ENV_ID \
-r cli,html \
--out-dir ./apidog-reports
'''
}
}
}
}
post {
always {
archiveArtifacts artifacts: 'apidog-reports/**', allowEmptyArchive: true
}
}
}
O H em H 2 * * * é uma conveniência do Jenkins: ele escolhe um minuto estável dentro da hora para que todos os seus trabalhos noturnos não se aglomerem exatamente às 02:00.

Esse campo cron é o mesmo em todas as três plataformas. 0 2 * * * significa minuto 0, hora 2, todos os dias. Quer duas vezes por noite para pegar problemas mais cedo? 0 2,14 * * *. Apenas dias de semana? 0 2 * * 1-5. Escolha um horário em que seu ambiente de staging esteja tranquilo e os sandboxes externos estejam ativos.
Passo 4: Torne as falhas impossíveis de ignorar
Uma execução noturna que falha em um log que ninguém lê é pior do que nenhuma execução noturna; ela constrói uma falsa confiança. O objetivo principal é o alerta. Conecte o resultado para onde sua equipe já olha.
O código de saída do CLI é seu gancho. apidog run sai com um valor diferente de zero quando um cenário falha, então o CI automaticamente marca o trabalho como falha. A partir daí:
- Deixe o CI notificar por conta própria. GitHub Actions, GitLab e Jenkins todos enviam e-mail ou mensagem para a equipe responsável em caso de falha de uma execução agendada. Ative isso.
- Publique no chat. Adicione uma etapa que dispara uma mensagem do Slack ou webhook em caso de falha com um link para a execução e o relatório HTML arquivado. O relatório mostra qual cenário, qual etapa e qual asserção falhou, para que o engenheiro de plantão comece a depurar em vez de reproduzir.
- Acompanhe a tendência, não apenas o pass/fail. O Apidog pode fazer o upload do relatório para que você mantenha um histórico. Uma única noite vermelha é ruído; três vermelhas seguidas no mesmo endpoint é um sinal.
Uma disciplina mantém as compilações noturnas confiáveis: trate uma falha como um bug real até que se prove o contrário. A maneira mais rápida de acabar com um conjunto noturno é deixar que testes instáveis ensinem a todos a ignorar o vermelho. Se um cenário falha intermitentemente, corrija o teste ou o ambiente; não ignore. Executar com -n para repetir um cenário, ou estabilizar os dados dos quais seu cenário depende, geralmente expõe a verdadeira instabilidade.
Por que o Apidog se encaixa no padrão noturno
Você pode montar um pipeline de API noturno a partir de partes separadas: uma ferramenta para projetar, outra para escrever testes, uma terceira para executá-los em modo headless e um validador de esquema adicionado. Muitas equipes vivem dessa forma, e funciona até que as peças se descoordenem. O atrito aparece às 2 da manhã, quando o teste executado pelo executor não corresponde mais à API que você realmente implantou.


O Apidog condensa isso em um único fluxo de trabalho. O endpoint que você projeta, o cenário que você testa, o esquema contra o qual você valida e o comando que você agenda, todos referenciam a mesma fonte da verdade. Quando você altera um endpoint, o cenário e a verificação de esquema se movem com ele. Não há etapa de exportação, nenhuma coleção que fica silenciosamente desatualizada, nenhuma segunda cópia do contrato para manter sincronizada. Se você já sentiu a dor de coleções do Postman que não são uma verdadeira fonte de verdade, esse design de fonte única faz a diferença.
O CLI é o mesmo motor da GUI, então um cenário que você depura visualmente em sua mesa é executado de forma idêntica no CI às 2 da manhã. Você constrói e corrige testes com total visibilidade e, em seguida, os executa em modo headless com um único comando. Essa simetria é o que torna uma compilação noturna algo em que você confia, em vez de algo que você precisa monitorar constantemente.
Perguntas frequentes
Qual é a diferença entre uma compilação noturna e a integração contínua?
A integração contínua executa testes em cada mudança de código para detectar regressões em novos commits. Uma compilação noturna é executada em um cronograma fixo, geralmente durante a noite, independentemente de algo ter mudado. O CI detecta o que sua equipe quebra; a execução noturna detecta o que o mundo exterior quebra: tokens expirados, dependências desviadas, mudanças de dados e rastejamento lento de desempenho. Pipelines maduros executam ambos. Testes de fumaça rápidos protegem cada commit, e um conjunto de regressão mais amplo é executado noturnamente.
A que horas uma compilação noturna deve ser executada?
Escolha um período em que seu ambiente de teste esteja ocioso e os serviços externos dos quais você depende estejam acessíveis. Para muitas equipes, isso é da 1h às 4h da manhã, horário local. Se suas APIs chamam sandboxes de terceiros, confirme se estão ativas nesse horário; alguns provedores limitam ou pausam durante a noite. Evite agendar exatamente na hora cheia em CI compartilhado, onde milhares de trabalhos são acionados de uma vez; um atraso de alguns minutos (ou usando a sintaxe H do Jenkins) distribui a carga.
Posso executar um conjunto noturno contra a produção?
Execute verificações somente leitura contra a produção com segurança. Para qualquer coisa que escreva dados, direcione o conjunto noturno para um ambiente de staging ou pré-produção dedicado com dados realistas, ou use operações idempotentes e uma etapa de limpeza. Um padrão comum é uma execução de regressão completa de leitura e escrita contra o staging, mais uma pequena execução de fumaça somente leitura contra a produção para confirmar que o sistema em produção está acessível e respondendo corretamente.
Como isso difere do monitoramento?
O monitoramento de uptime responde "a API está funcionando?" Um conjunto de regressão noturna responde "a API está correta?" O monitoramento faz um ping em um endpoint e verifica um 200. Uma execução de regressão exercita fluxos de trabalho completos, valida corpos de resposta contra seu esquema, verifica limites de autenticação e afirma regras de negócios. Eles são complementares; o monitoramento é contínuo e superficial, o teste noturno é periódico e profundo.
Preciso escrever código para agendar testes de API?
Não. Você constrói cenários visualmente no Apidog sem script, então copia o comando apidog run gerado do painel de CI/CD. O único "código" são as poucas linhas de YAML ou configuração de pipeline que informam à sua plataforma de CI quando executar, e esses são os modelos acima. Se você preferir ver como os executores de linha de comando se comparam em geral, Postman CLI vs Newman e executando coleções no CI sem Newman cobrem as alternativas.
Configure sua primeira execução noturna
Comece pequeno. Escolha um fluxo de trabalho crítico, seu fluxo de login ou seu caminho de checkout, e construa-o como um único cenário Apidog com asserções reais. Execute-o localmente com o CLI até que esteja verde. Coloque o comando gerado em um trabalho agendado usando um dos modelos acima. Conecte a falha ao chat da sua equipe. Isso é uma compilação noturna funcionando em uma tarde.
A partir daí, expanda o conjunto. Adicione cenários para as jornadas mais importantes seguintes, ative a validação de esquema em todos os níveis e defina orçamentos de desempenho em seus endpoints mais utilizados. Em uma semana, você terá uma rede de regressão que detecta as falhas que seus testes por commit nunca foram projetados para ver, e você as ouvirá de uma mensagem de chat às 2 da manhã em vez de um cliente às 9.
