Dans les tests de logiciels , un oracle de test (ou simplement oracle ) est un fournisseur d'informations qui décrit la sortie correcte en fonction de l'entrée d'un cas de test . Les tests avec un oracle impliquent de comparer les résultats réels du système testé (SUT) avec les résultats attendus fournis par l'oracle.
Le terme « oracle de test » a été introduit pour la première fois dans un article de William E. Howden. Des travaux supplémentaires sur différents types d'oracles ont été explorés par Elaine Weyuker .
Un oracle peut fonctionner séparément du SUT ; accessible au moment de l'exécution du test , ou il peut être utilisé avant l'exécution d'un test avec les résultats attendus codés dans la logique de test.
Cependant, les postconditions de méthode font partie du SUT, en tant qu'oracles automatisés dans les modèles de conception par contrat .
Déterminer la sortie correcte pour une entrée donnée (et un ensemble d'états de programme ou de système) est connu sous le nom de problème de l'oracle ou problème de l'oracle de test , que certains considèrent comme un problème relativement difficile et implique de travailler avec des problèmes liés à la contrôlabilité et à l'observabilité.
Catégories
Une étude de la littérature de recherche couvrant la période 1978 à 2012 a révélé plusieurs catégories potentielles d’oracles de test.
Spécifié
Un oracle spécifié est généralement associé à des approches formalisées de modélisation de logiciels et de construction de code logiciel. Il est lié à la spécification formelle , à la conception basée sur un modèle qui peut être utilisée pour générer des oracles de test, à la spécification de transition d'état pour laquelle des oracles peuvent être dérivés pour faciliter les tests basés sur un modèle et les tests de conformité de protocole , et à la conception par contrat pour laquelle l'oracle de test équivalent est une assertion .
Les oracles de test spécifiés présentent un certain nombre de défis. La spécification formelle repose sur l'abstraction, qui à son tour peut naturellement comporter un élément d'imprécision car tous les modèles ne peuvent pas capturer tous les comportements.
Dérivé
Un oracle de test dérivé différencie le comportement correct et incorrect en utilisant des informations dérivées d'artefacts du système. Il peut s'agir de documentation, de résultats d'exécution du système et de caractéristiques des versions du SUT. Les suites de tests de régression (ou rapports) sont un exemple d'oracle de test dérivé - elles sont construites sur l'hypothèse que le résultat d'une version précédente du système peut être utilisé comme aide (oracle) pour une future version du système. Les caractéristiques de performance mesurées précédemment peuvent être utilisées comme oracle pour les futures versions du système, par exemple, pour déclencher une question sur la dégradation potentielle des performances observée. La documentation textuelle des versions précédentes du système peut être utilisée comme base pour guider les attentes dans les futures versions du système.
Un pseudo-oracle tombe dans la catégorie des oracles de test dérivés. Un pseudo-oracle, tel que défini par Weyuker, est un programme écrit séparément qui peut prendre la même entrée que le programme ou le SUT afin que leurs sorties puissent être comparées pour comprendre s'il pourrait y avoir un problème à étudier.
Un oracle partiel est un hybride entre un oracle de test spécifié et un oracle de test dérivé. Il spécifie des propriétés importantes (mais pas complètes) du SUT. Par exemple, les tests métamorphiques exploitent ces propriétés, appelées relations métamorphiques, sur plusieurs exécutions du système.
Implicite
Un oracle de test implicite s'appuie sur des informations et des hypothèses implicites. Par exemple, il peut y avoir une conclusion implicite à partir d'un crash de programme, c'est-à-dire un comportement indésirable - un oracle pour déterminer qu'il peut y avoir un problème. Il existe un certain nombre de façons de rechercher et de tester un comportement indésirable, que certains appellent cela des tests négatifs, où il existe des sous-ensembles spécialisés tels que le fuzzing .
Les oracles de test implicites présentent des limites, car ils reposent sur des conclusions et des hypothèses implicites. Par exemple, le crash d'un programme ou d'un processus peut ne pas être un problème prioritaire si le système est tolérant aux pannes et fonctionne donc sous une forme d'auto-réparation/ auto-gestion . Les oracles de test implicites peuvent être sujets à de faux positifs en raison des dépendances de l'environnement. Les tests basés sur les propriétés reposent sur des oracles implicites.
Humain
Un humain peut agir comme un oracle de test. Cette approche peut être catégorisée comme quantitative ou qualitative. Une approche quantitative vise à trouver la bonne quantité d'informations à recueillir sur un SUT (par exemple, les résultats des tests) pour qu'une partie prenante puisse prendre des décisions sur l'adéquation à l'usage ou la sortie du logiciel. Une approche qualitative vise à trouver la représentativité et l'adéquation des données de test d'entrée et le contexte de la sortie du SUT. Un exemple consiste à utiliser des données de test réalistes et représentatives et à donner un sens aux résultats (s'ils sont réalistes). Ceux-ci peuvent être guidés par des approches heuristiques , telles que l'instinct, les règles empiriques, les aides à la liste de contrôle et l'expérience pour aider à adapter la combinaison spécifique sélectionnée pour le SUT.
Exemples
Les oracles de test sont généralement basés sur des spécifications et de la documentation . Une spécification formelle utilisée comme entrée pour la conception basée sur un modèle et les tests basés sur un modèle serait un exemple d' oracle de test spécifié . L' oracle basé sur un modèle utilise le même modèle pour générer et vérifier le comportement du système. Une documentation qui n'est pas une spécification complète du produit, comme un guide d'utilisation ou d'installation, ou un enregistrement des caractéristiques de performances ou des exigences minimales de la machine pour le logiciel, serait généralement un oracle de test dérivé.
Un oracle de cohérence compare les résultats d'une exécution de test à une autre pour vérifier la similarité. Il s'agit d'un autre exemple d'oracle de test dérivé.
Un oracle pour un programme logiciel peut être un deuxième programme qui utilise un algorithme différent pour évaluer la même expression mathématique que le produit testé. Il s'agit d'un exemple de pseudo-oracle, qui est un oracle de test dérivé.
Lors d' une recherche Google , nous ne disposons pas d'un oracle complet pour vérifier si le nombre de résultats renvoyés est correct. Nous pouvons définir une relation métamorphique telle qu'une recherche ultérieure restreinte produira moins de résultats. Il s'agit d'un exemple d'oracle partiel, qui est un hybride entre l'oracle de test spécifié et l'oracle de test dérivé.
Un oracle statistique utilise des caractéristiques probabilistes, par exemple avec l'analyse d'image où une plage de certitude et d'incertitude est définie pour que l'oracle de test puisse prononcer une correspondance ou non. Il s'agit là d'un exemple d'approche quantitative dans un oracle de test humain.
Un oracle heuristique fournit des résultats représentatifs ou approximatifs sur une classe d'entrées de test. Ce serait un exemple d'approche qualitative dans un oracle de test humain.