Glossario · Fondamenti del testing
Oracolo di test (test oracle)
In inglese: Test oracle
Detto anche: oracolo, oracoli di test, problema dell'oracolo, oracle problem
Definizione
La fonte di verità con cui un test decide se un output è corretto, come una specifica, una versione precedente, un modello di riferimento o una regola.
Un oracolo di test (test oracle) è qualunque cosa ti dica qual è la risposta giusta. Eseguire un test produce un output; l’oracolo è il meccanismo che giudica quell’output come superato o fallito. Di solito è il risultato atteso scritto nel test case, ma per molti sistemi capire quale sia il risultato atteso è la parte più difficile del testing. Questa difficoltà è nota come problema dell’oracolo (oracle problem).
Tipi di oracolo
- Risultato specificato. Un requisito dice che un ordine da 200 $ con il 10% di sconto ha un totale di 180 $. L’asserzione confronta con quel valore.
- Implementazione di riferimento. Confronta con un’alternativa affidabile: una release precedente, il calcolo di un concorrente o un algoritmo semplice ma lento che verifica uno veloce e ottimizzato.
- Coerenza e proprietà. Potresti non conoscere l’output esatto, ma conosci le regole che deve rispettare. Un ordinamento deve restituire gli stessi elementi in ordine non decrescente; codificare e poi decodificare deve restituire l’input originale.
- Baseline salvata. I test snapshot e di visual regression considerano corretto un output precedente approvato.
- Giudizio umano. Un tester decide se un layout o un testo generato è accettabile. Flessibile, ma lento e poco coerente.
Esempio: un oracolo basato sulle proprietà
Non puoi scrivere a mano l’output atteso per ogni possibile input di una funzione di ordinamento, ma puoi verificare le proprietà che ogni risultato corretto possiede:
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;
}
Perché è importante
Un test vale quanto il suo oracolo. Un test che attraversa il checkout cliccando e verifica solo che non sia comparso alcun errore ha un oracolo molto debole: passerà anche addebitando l’importo sbagliato. Gli oracoli deboli sono uno dei motivi principali per cui un’alta code coverage non garantisce una buona suite. Il problema dell’oracolo è centrale anche nel test dei sistemi di AI, dove gli output variano e i team si affidano a golden dataset, rubriche di valutazione o a un secondo modello che fa da giudice.