← Curso IA na prática para Programadores: do prompt ao pull request 22 aulas
Do requisito vago ao plano que se revisa

Critérios de aceite que a máquina consegue testar

Conceito 8 min de leitura

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.

Ao final desta aula você consegue
  • 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.
Critérios que não testam nada
- 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.

Os mesmos, observáveis
- 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

Converter critérios em testes — sem implementar a feature
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.

Esqueleto gerado — repare nos nomesphp
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
}
Repare no 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.
ArmadilhaCritério que descreve a implementação

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 deEscreva
"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"
Checagem antes de seguir
  • 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.
Em uma frase
  • 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 Google

Ainda não há comentários nesta aula.