Critérios de aceite que a máquina consegue testar
Como escrever Dado/Quando/Então de forma que o critério vire teste automatizado sem tradução — e por que critério subjetivo é dívida.
Um critério de aceite bem escrito é meio teste pronto. Um mal escrito é uma discussão adiada para o dia da entrega.
- Distinguir critério observável de critério de opinião.
- Escrever no formato Dado/Quando/Então sem virar burocracia.
- Gerar o esqueleto do teste a partir do critério.
- A exportação deve ser rápida - O PDF deve ficar bonito - Tratar os erros adequadamente - Funcionar para todos os usuários
Nenhum deles pode ser marcado como cumprido ou não sem alguém opinar. No dia da entrega, viram discussão.
- Dado um filtro de até 31 dias, quando o usuário clica em Exportar,
então o download começa em até 5 segundos no p95.
- Dado um relatório com acentuação ("São Paulo", "Relatório"),
quando o PDF é gerado, então os caracteres aparecem corretos.
- Dado que a geração falha, quando o usuário volta à tela,
então vê a mensagem de erro e o botão continua clicável.
- Dado um usuário sem a permissão vendas.exportar,
quando ele chama o endpoint direto, então recebe 403 e nada é gerado.Cada linha vira um teste. Nenhuma depende de opinião no dia da entrega.
A diferença: A diferença não é o formato — é a presença de número, entrada concreta e saída observável. "Rápido" virou "5 segundos no p95"; "todos os usuários" virou uma permissão nomeada e um código HTTP.
Do critério ao esqueleto do teste
Converta os critérios abaixo em esqueletos de teste. Stack de teste: [PHPUnit 10 / pytest 7 / Vitest 1] Convenção: [o nome do teste descreve a regra, não o método] Critérios: [cole os critérios em Dado/Quando/Então] Regras: - Um teste por critério, com nome que descreva a regra. - Deixe o corpo com o arranjo e a asserção; marque com TODO o que depende de código que ainda não existe. - Não implemente a feature. - Aponte qualquer critério que você NÃO conseguiu converter e explique o que falta nele.
A última regra é a mais valiosa: um critério que não vira teste é um critério mal escrito, e o assistente é bom em apontar isso.
public function test_exportacao_de_ate_31_dias_inicia_em_ate_5s(): void
{
$filtro = ['de' => '2026-03-01', 'ate' => '2026-03-31'];
$inicio = microtime(true);
$resposta = $this->post('/relatorios/vendas/exportar', $filtro);
$decorrido = microtime(true) - $inicio;
$resposta->assertOk();
$this->assertLessThan(5.0, $decorrido); // TODO: medir p95 no teste de carga, não aqui
}
public function test_usuario_sem_permissao_recebe_403_e_nada_e_gerado(): void
{
$usuario = $this->usuarioSem('vendas.exportar');
$resposta = $this->actingAs($usuario)->post('/relatorios/vendas/exportar', []);
$resposta->assertForbidden();
$this->assertSame(0, Exportacao::count()); // nada foi gerado
}TODO do primeiro teste: o assistente marcou corretamente que p95 não se mede em teste unitário. Esse tipo de ressalva é o que você quer que apareça.Um erro frequente é escrever "então o serviço PdfExporter é chamado com o parâmetro X". Isso não é critério de aceite: é uma amarra na implementação atual.
O teste correspondente passa a quebrar em toda refatoração, mesmo quando o comportamento continua certo — e o time aprende a ignorar testes vermelhos, que é o pior resultado possível.
Como perceber: Se o critério cita nome de classe, método ou tabela, ele está descrevendo o como. Reescreva descrevendo o que o usuário observa.
| Em vez de | Escreva |
|---|---|
| "deve ser rápido" | "responde em até Xms no p95 com N registros" |
| "tratar erros" | "em falha do provedor, responde 502 e registra o id da tentativa" |
| "validar entrada" | "e-mail sem @ retorna 422 com a lista de campos inválidos" |
| "funcionar em produção" | "suporta N requisições simultâneas sem duplicar registro" |
| "chamar o serviço X" | "o pedido aparece com status enviado e o cliente recebe e-mail" |
- Cada critério tem entrada concreta e saída observável.
- Nenhum critério cita nome de classe, método ou tabela.
- Números substituíram adjetivos.
- Todo critério virou pelo menos um teste, ou foi reescrito.
- Critério de aceite bom descreve o que se observa de fora; se cita nome de classe, virou amarra na implementação.
Comentários e dúvidas
Inscreva-se grátis para comentar, tirar dúvidas, marcar seu progresso e emitir o certificado ao fim do curso.
Inscrever-se grátis com GoogleAinda não há comentários nesta aula.