Glossário · Fundamentos de testes
Oráculo de teste
Em inglês: Test oracle
Também chamado de: oráculo, oráculos de teste, problema do oráculo, oracle problem
Definição
A fonte de verdade que um teste usa para decidir se uma saída está correta, como uma especificação, uma versão anterior, um modelo de referência ou uma regra.
Um oráculo de teste (test oracle) é aquilo que diz qual é a resposta certa. Executar um teste produz uma saída; o oráculo é o mecanismo que julga essa saída como aprovada ou reprovada. Normalmente é o resultado esperado escrito no caso de teste, mas, em muitos sistemas, descobrir qual é o resultado esperado é a parte mais difícil do teste. Essa dificuldade é conhecida como o problema do oráculo (oracle problem).
Tipos de oráculo
- Resultado especificado. Um requisito diz que um pedido de US$ 200 com 10% de desconto totaliza US$ 180. A assertion compara com esse valor.
- Implementação de referência. Compare com uma alternativa confiável: um release anterior, o cálculo de um concorrente, ou um algoritmo simples e lento verificando um rápido e otimizado.
- Consistência e propriedades. Você pode não saber a saída exata, mas conhece regras que ela precisa obedecer. Uma ordenação precisa retornar os mesmos elementos em ordem não decrescente; codificar e depois decodificar precisa devolver a entrada original.
- Baseline armazenada. Testes de snapshot e de regressão visual tratam uma saída anterior aprovada como correta.
- Julgamento humano. Um tester decide se um layout ou um texto gerado é aceitável. É flexível, mas lento e inconsistente.
Exemplo: um oráculo baseado em propriedades
Você não consegue escrever à mão a saída esperada para cada entrada possível de uma função de ordenação, mas consegue verificar propriedades que qualquer resultado correto tem:
function checkSorted(input: number[], output: number[]): boolean {
const sameLength = input.length === output.length;
const ordered = output.every((v, i) => i === 0 || output[i - 1] <= v);
const sameItems =
[...input].sort((a, b) => a - b).join(',') === output.join(',');
return sameLength && ordered && sameItems;
}
Por que isso importa
Um teste é tão bom quanto o seu oráculo. Um teste que percorre o checkout e verifica apenas que nenhum erro apareceu tem um oráculo muito fraco: ele vai passar mesmo cobrando o valor errado. Oráculos fracos são um dos principais motivos pelos quais uma alta cobertura de código não garante uma boa suíte. O problema do oráculo também é central para testar sistemas de IA, em que as saídas variam e os times dependem de golden datasets, rubricas ou de um segundo modelo atuando como juiz.