Glossaire · Fondamentaux du test
Oracle de test
En anglais : Test oracle
Également appelé : oracles de test, test oracles, problème de l'oracle, oracle problem
Définition
La source de vérité qu'un test utilise pour décider si un résultat est correct, comme une spécification, une version précédente, un modèle de référence ou une règle.
Un oracle de test (test oracle) est ce qui vous dit quelle est la bonne réponse. L’exécution d’un test produit un résultat ; l’oracle est le mécanisme qui juge ce résultat comme réussi ou échoué. Le plus souvent, c’est le résultat attendu écrit dans le cas de test, mais pour de nombreux systèmes, déterminer le résultat attendu est la partie la plus difficile du test. Cette difficulté est connue sous le nom de problème de l’oracle.
Types d’oracles
- Résultat spécifié. Une exigence indique qu’une commande de 200 $ avec 10 % de remise revient à 180 $. L’assertion compare avec cette valeur.
- Implémentation de référence. Comparer avec une alternative de confiance : une version précédente, le calcul d’un concurrent, ou un algorithme simple mais lent qui contrôle un algorithme rapide et optimisé.
- Cohérence et propriétés. Vous ne connaissez peut-être pas le résultat exact, mais vous connaissez les règles qu’il doit respecter. Un tri doit renvoyer les mêmes éléments dans un ordre croissant ou égal ; encoder puis décoder doit redonner l’entrée d’origine.
- Référence enregistrée (baseline). Les tests de snapshot et de régression visuelle considèrent comme correct un résultat antérieur approuvé.
- Jugement humain. Un testeur décide si une mise en page ou un texte généré est acceptable. Souple, mais lent et peu constant.
Exemple : un oracle fondé sur des propriétés
Impossible d’écrire à la main le résultat attendu pour chaque entrée possible d’une fonction de tri, mais vous pouvez vérifier les propriétés que tout résultat correct possède :
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;
}
Pourquoi c’est important
Un test ne vaut que ce que vaut son oracle. Un test qui parcourt le tunnel de commande et vérifie seulement qu’aucune erreur n’est apparue a un oracle très faible : il passera même en débitant le mauvais montant. Les oracles faibles sont l’une des principales raisons pour lesquelles une couverture de code élevée ne garantit pas une bonne suite. Le problème de l’oracle est aussi central pour tester les systèmes d’IA, dont les sorties varient et pour lesquels les équipes s’appuient sur des jeux de données de référence (golden datasets), des grilles d’évaluation ou un second modèle jouant le rôle de juge.