# Oracle (Softwaretest)

Ein Oracle bezeichnet einen Mechanismus zum Softwaretest, insbesondere in den Bereichen Computing und Softwaretechnik, der als Nachweis für das Bestehen oder Nichtbestehen eines Tests (System Under Test, SUT) verwendet wird. Testen bedeutet in diesem Zusammenhang, ein System zu stimulieren und seine Reaktion zu beobachten. Stimulus und Reaktion haben beide Werte, die übereinstimmen können, z. B. wenn der Stimuluswert und die Reaktion beide reell sind. Die Herausforderung, für ein System das entsprechende gewünschte, korrekte Ergebnis von einem potentiell falschen Ergebnis zu unterscheiden, wird als Oracle Problem bezeichnet.
Der Begriff (Test-)Oracle geht dabei zurück auf William E. Howden. Weitergehende Aspekte wurden insbesondere von Elaine Elaine Weyuker beschrieben.

## Kategorien

In der Wissenschaft wird zwischen verschiedenen Kategorien von Oracle unterschieden.

### Spezifische Oracle

Diese Oracle werden typischerweise für formalisierte Ansätze der Software-Modellierung und Erstellung von Software-Codes verwendet. Eine Spezifikation definiert das Oracle für einen bestimmten Anwendungsbereich. Eine Spezifikationssprache bezeichnet dabei eine Notation zur Definition eines spezifischen Oracle, das beurteilen soll, ob das Verhalten eines Systems mit einer formalen Spezifikation übereinstimmt. Für Test nach formalen Spezifikationen haben sich bestimmte Methoden durchgesetzt: Modellbasiertes Testen, Transitionssysteme Assertionen, Designs by contract (DbC), oder algebraische Spezifikationen. Modellbasierte Sprachen definieren Modelle und eine Syntax, die das gewünschte Verhalten in Bezug auf seine Auswirkungen auf das Modell definiert. Transitionssysteme befassen sich mit der Modellierung der Reaktion eines Systems auf Stimuli, die in diesem speziellen Formalismus als Übergänge (Transition) bezeichnet werden. Assertionen und Designs by Contracts sind Fragmente einer Spezifikationssprache, die mit Anweisungen der Implementierungssprache verschachtelt sind und zur Laufzeit überprüft werden. Algebraische Spezifikationen definieren Gleichungen über die Operationen eines Programms die gelten, wenn das Programm korrekt ist. Herausforderung bei der Erstellung von spezifischen Oracle ist zunächst das Fehlen einer formalen Spezifikation, die bei anderen Kategorien bereits vorliegen. Zudem setzen Modelle mit formaler Spezifikation zwingend auf Abstraktion. Dies impliziert regelmäßig Ungenauigkeiten bspw. infolge von undurchführbaren Verhalten. Letztlich bedarf die Modellausgabe einer Interpretation, um sie mit der konkreten Programmausgabe gleichzusetzen.

### Abgeleitete Oracle

Ein abgeleitetes Oracle unterscheidet zwischen korrektem und inkorrektem Verhalten, indem es auf Heuristiken setzt. Dazu werden bekannte Informationen verwendet, die aus Artefakten des Systems wie Dokumentation, Ergebnisse der Systemausführung und Merkmale von Versionen des zu testenden Systems abgeleitet werden.
Darunter fällt etwa das Pseudo-Oracle, welches nach der Definition von Weyuker ein eigenständiges Programm darstellt, das dieselbe Eingabe wie das zu testende Programm oder System verarbeiten kann. Somit können die Ausgaben verglichen werden, um festzustellen, ob es ein zu untersuchendes Problem gibt.
Ein partielles Oracle ist eine Kombination aus einem spezifizischen Oracle (s. o.) und einem abgeleiteten Oracle. Es spezifiziert wichtige (aber nicht sämtliche) Eigenschaften des zu testenden Systems. Beim metamorphen Testen werden beispielsweise solche Eigenschaften, die sogenannten metamorphen Relationen, über mehrere Ausführungen des Systems hinweg ausgewertet.

### Implizierte Oracle

Ein implizites Oracle stützt sich auf implizite Informationen und Annahmen. So wird anhand von bekannten Informationen auf unbekannte Informationen geschlossen (Heuristik). So kann etwa aus einem technischen Vorfall auf ein unerwünschtes Verhaltensmuster geschlossen werden, das dem System inhärent anhaftet. Umgekehrt kann konkret nach unerwünschten Verhaltensmuster gesucht werden (negatives Testen). Eine Möglichkeit dafür ist das Fuzzing.
Für implizierte Oracle bestehen generelle Einschränkungen, da sie lediglich auf Annahmen und Schlussfolgerungen beruhen. Aufgrund dieser Abhängigkeiten sind sie daher anfällig für falsch positive Ergebnisse.

### Menschliche Oracle

Wenn spezifische, abgeleitete oder implizite Oracle aus technischen Gründen nicht anwendbar sind, sind menschliche Eingaben zur Bestimmung erforderlich. Diese können als quantitative und qualitative Ansätze beschrieben werden. Ein quantitativer Ansatz zielt darauf ab, die richtige Menge an Informationen über ein zu prüfendes System (z. B. Testergebnisse) zu sammeln, um Entscheidungen über die Eignung für einen bestimmten Zweck oder die Freigabe der Software treffen zu können. Ein qualitativer Ansatz zielt darauf ab, die Eignung der eingegebenen Testdaten und den Kontext der Ausgabe des getesteten Systems zu ermitteln. Ein Beispiel ist die Verwendung realistischer und repräsentativer Testdaten und die Interpretation der Ergebnisse (sofern sie realistisch sind). Dabei kann man sich von heuristischen Ansätzen leiten lassen, wie z. B. Bauchgefühl, Faustregeln, Checklisten und Erfahrung, um die spezifische Kombination für das zu testende Programm/System anzupassen.

## Beispiele

Oracle basieren in der Regel auf Spezifikationen und Dokumentation. Eine formale Spezifikation, die als Input für den modellbasierten Entwurf und modellbasiertes Testen verwendet wird, ist ein Beispiel für ein spezifisches Oracle. Das modellbasierte Oracle verwendet dasselbe Modell, um das Systemverhalten zu generieren und zu verifizieren. Eine Dokumentation, bei der es sich nicht um eine vollständige Spezifikation des Produkts handelt, wie z. B. ein Benutzer- oder Installationshandbuch oder eine Aufzeichnung der Leistungsmerkmale oder Mindestanforderungen an den Rechner für die Software, wäre typischerweise ein abgeleitetes Oracle. Ein Konsistenz-Oracle ist ebenfalls ein abgeleitetes Oracle und vergleicht die Ergebnisse einer Testausführung mit denen einer anderen auf Übereinstimmung.
Zum Testen eines Softwareprogramm kann ein Oracle genutzt werden, welches als ein zweites Programm einen anderen Algorithmus verwendet, um denselben mathematischen Ausdruck auszuwerten wie das zu testende Programm. Hierbei handelt es sich um ein Beispiel für ein Pseudo-Oracle in Form eines abgeleiteten Oracle.
Bei der Google-Suche mangelt es dem Nutzer an einem Oracle, mit dem überprüft werden kann, ob die Anzahl der gefundenen Ergebnisse korrekt ist. In diesem Fall kann eine metamorphe Beziehung so definiert werden, dass eine nachfolgende eingeschränkte Suche weniger Ergebnisse liefert. Hierbei handelt es sich um ein Beispiel für ein partielles Oracle, i.e. eine Mischung aus einem spezifischen und einem abgeleiteten Oracle.
Ein statistisches Oracle verwendet probabilistische Merkmale, z. B. bei der Bildanalyse, bei der ein Bereich von Gewissheit und Ungewissheit bestimmt wird, damit das Oracle eine potentielle Übereinstimmung feststellen kann. Dies wäre ein Beispiel für einen quantitativen Ansatz bei einem menschlichen Oracle.
Ein heuristisches Oracle liefert repräsentative oder annähernde Ergebnisse für eine Klasse von Testeingaben. Dies wäre ein Beispiel für einen qualitativen Ansatz bei einem menschlichen Oracle.