Test Oracles Flashcards

1
Q

Explain the terms test oracle and test oracle problem.

A

Ein Test-Oracle ist ein Entscheidungsverfahren, um das Testergebnis zu bestimmen, also ob ein Test erfolgreich (bestanden) ist, also ob das Verhalten korrekt ist, oder fehlgeschlagen ist. Test-Oracles können Menschen oder automatisch ausgewertet werden, z. B. durch Assertions.

Das Test-Oracle-Problem besteht darin, dass es schwierig ist, zwischen erwartetem (korrektem) und inkorrektem Verhalten zu unterscheiden. Dies ist eine offene und nicht gut gelöste Herausforderung, die in Forschungsgemeinschaften weniger Aufmerksamkeit erhalten hat als die Testeingabe-Generierung. Es ist ein Engpass für die Testautomatisierung.

Um das Test-Oracle-Problem zu bewältigen, kann man erwartetes Verhalten aus Benutzerdokumentationen, Softwareentwicklungsdokumenten (z. B. Anforderungs- und Entwurfsdokumente), Referenzimplementierungen, (algebraischen) Eigenschaften, wissenschaftlichen Gesetzen oder Vorschriften extrahieren. Weitere Möglichkeiten sind Code-Anmerkungen, Assertions, API-Dokumentationen (z. B. JavaDoc) oder Verhaltensspezifikationssprachen (z. B. (Open)JML).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

What is an “oracle” in software testing. What purpose does it serve?

A

Ein “Oracle” ist eine Funktion, die Tupel von beobachteten Eingaben/Ausgaben auf einen booleschen Wert abbildet, je nachdem, ob das Eingabe/Ausgabe-Tupel der System-/Komponentenspezifikation entspricht. Weniger formell ausgedrückt: Ein “Orakel” sagt Ihnen, ob eine beobachtete Ausgabe als Reaktion auf eine bestimmte Eingabe als Fehler angesehen wird oder nicht. Ein Oracle ist also notwendig, um Fehler zu beobachten, was eine Voraussetzung für die Erkennung von Fehlern ist. Daher sind Orakel für das Testen unerlässlich. Kein “Oracle” → kein Testen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Name sources of information for test oracles.

A
  1. Benutzerdokumentationen
  2. Softwareentwicklungsdokumente (z. B. Anforderungs- und Entwurfsdokumente)
  3. Referenzimplementierungen
  4. (Algebraische) Eigenschaften und wissenschaftliche Gesetze
  5. Vorschriften
  6. Code-Anmerkungen
  7. Assertions
  8. API-Dokumentationen (z. B. JavaDoc)
  9. Verhaltensspezifikationssprachen (z. B. (Open)JML)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

What is an “executable assertion” or just “assertion” in programming? How can they be used for testing?

A

Ausführbare Assertions sind eine defensive Programmiertechnik, mit der sichergestellt wird, dass Programme im Falle unerwarteter Ausführungsbedingungen oder verletzter Vorbedingungen frühzeitig und kontrolliert fehlschlagen. Assertions können verwendet werden, um den Vergleich der Softwareausgabe mit der erwarteten Ausgabe in Tests zu automatisieren.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Name and discuss techniques to automatically execute test oracles.

A

Repräsentationsinvarianten: Verwenden Sie nulläre Methoden, die mit @CheckRep annotiert sind, oder spezielle Methoden wie repOk oder checkRep.
Prädikatmethoden: Testen Sie den Rückgabewert einer booleschen Methode als Test-Oracle.
Programm-Assertions: Verwenden Sie assert-Anweisungen, um Bedingungen zur Laufzeit zu prüfen.
JUnit-eigene Assertions: Nutzen Sie eingebaute Utility-Methoden wie assertEquals, assertTrue oder assertFalse.
Externe Assertions-Bibliotheken: Verwenden Sie Java-Bibliotheken wie Hamcrest, AssertJ oder Google Truth für leistungsfähigere und flexiblere Assertions.
Java Modeling Language (JML): Definieren Sie Nachbedingungen für Methoden, Klasseninvarianten und andere Spezifikationen, die von Tools wie OpenJML oder KeY überprüft werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
A

Sie können die Summenfunktion mit einer ausführbaren Assertion verbessern, indem Sie eine assert-Anweisung hinzufügen, um einen Integer-Überlauf zu prüfen. Dies kann erfolgen, indem überprüft wird, ob das Ergebnis das gleiche Vorzeichen wie die Operanden hat, wenn diese das gleiche Vorzeichen haben:
int sum(int summand1, int summand2) {
int sum = summand1 + summand2;
assert (!((summand1 > 0 && summand2 > 0 && sum <= 0) || (summand1 < 0 && summand2 < 0 && sum >= 0))) : “Integer-Überlauf erkannt”;
return sum;
}
Diese Assertion prüft, ob ein Integer-Überlauf beim Addieren von summand1 und summand2 auftritt. Wenn ein Überlauf auftritt, wirft die assert-Anweisung einen AssertionError mit einer Nachricht, die das Problem anzeigt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Please look up the specification of the ceil function in the POSIX standard: https://pubs.
opengroup.org/onlinepubs/9699919799.2018edition/. What are the expected return values for an input of
* 0.3
* – 0.3
* 0
* NaN
* – Inf
* INT_MAX + 0.3

A
  • 0.3 → 1.0
  • – 0.3 → – 0
  • 0 → 0
  • NaN → NaN
  • – Inf → – Inf
  • INT_MAX + 0.3 → INT_MAX + 1.0
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Please look up the specification of the malloc function in the POSIX standard (https://pubs.
opengroup.org/onlinepubs/9699919799.2018edition/).
Assuming 1 KiB of free memory on your machine, what are the expected return values for an input of
* 4
* 2048
* 0

A
  • 4 → A pointer to allocated memory space
  • 2048 → A null pointer (1 megabyte (MB) is typically defined as 1,000,000 bytes (10^6 bytes) in the decimal system. However, in the context of computer memory, where sizes are often given in binary multiples, 1 megabyte is often defined as 1,048,576 bytes (2^20 bytes).
  • 0 → Implementation-specified, either a null pointer or a pointer to allocated space (consult the system documentation that implements the POSIX specification to decide which one it is)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly