Übungsaufgaben zu Whitebox-Tests und Überdeckungsmaßen

https://bildung.social/@oerinformatik/

https://oer-informatik.de/whitebox-ueberdeckung-uebungsaufgaben

Whitebox-Test, Anweisungsüberdeckung, Zweigüberdeckung, Pfadüberdeckung, Bedingungsüberdeckung, Testabdeckung, Unit-Test, Softwaretest, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (Bearbeitungszeit insgesamt 75 min, mehrere Aufgaben): Zwei Übungsaufgaben zu Whitebox-Tests: durchlaufene und fehlende Anweisungen bestimmen, Anweisungs-, Zweig- und Pfadüberdeckungsgrad berechnen, Testdaten ergänzen, die Zahl der Pfade berechnen, die Mindestzahl an Testfällen bestimmen, eine englische Projektrichtlinie anwenden, einen Unit-Test formulieren und die Wahl eines Überdeckungsmaßes begründen [AI-Assisted]. (Zuletzt geändert am 28.10.2026)

Diese Übungsaufgaben gehören zum Artikel Was steckt in der Whitebox? Von Testgüte, Testüberdeckung und Codemetriken. Weitere, kleinere Übungen findest Du unter Leitfragen zur Whitebox-Systematik sowie in den Übungen ShippingCost, Rabatt und Sortierung.

Wortwolke mit den Begriffen der Übungsaufgaben: Whitebox-Test, Anweisungs-, Zweig-, Pfad- und Bedingungsüberdeckung, Überdeckungsgrad, Kontrollfluss, Testfall und Unit-Test (mit KI erstellt)

Hinweise zur Bearbeitung: Von FIA wird erwartet, dass ihnen Aufgaben auf Profilkompetenz-Ebene (Aufgabe 3.1 und Aufgabe 3.2) keine Probleme bereiten. Bearbeite jede Teilaufgabe schriftlich, bevor Du die Beispiellösung aufklappst. Für beide Aufgaben gilt: Als ausführbare Anweisungen zählen alle nummerierten Zeilen außer sonst, ende wenn, ende für und ende methode; auch Bedingungsprüfungen (wenn …) und der Schleifenkopf (für jedes …) zählen als Anweisung. Überdeckungsgrade gibst Du als Bruch und in Prozent an.

Du möchtest eigene Aufgaben zum Üben von einem KI-Sprachmodell generieren lassen?

Kopiere den Text in ein KI-Sprachmodell Deiner Wahl und passe Kompetenzstufe, Anzahl, Bearbeitungszeit und Szenario bei Bedarf an. Wie die Aufgaben aufgebaut sind, beschreibt der Artikel Wie sind die Aufgaben aufgebaut?. Prüfe die Ergebnisse mit dem Lehrartikel: KI-Sprachmodelle machen Fehler.

Erstelle neue Übungsaufgaben zum Thema „Whitebox-Tests und
Überdeckungsmaßen“.

Bauplan: Halte Dich an Aufbau, Kompetenzstufen, Operatoren,
Anforderungsbereiche, Punkte und Zeitschätzung, die im Artikel
https://oer-informatik.de/aufgaben-aufbau beschrieben sind.

Fachliche Grundlage:
- https://oer-informatik.de/codecoverage
- https://oer-informatik.de/blackboxtests
- https://oer-informatik.de/unit-tests
- https://oer-informatik.de/zyklomatische-komplexitaet
- Stilbeispiel: https://oer-informatik.de/whitebox-ueberdeckung-uebungsaufgaben

Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- Whitebox-Test
- Anweisungsüberdeckung
- Zweigüberdeckung
- Pfadüberdeckung
- Bedingungsüberdeckung
- Testabdeckung
- Unit-Test
- Softwaretest

Kompetenzstufe: Profilkompetenz (alternativ: Basiskompetenz, Kernkompetenz, Expertise)
Anzahl: 1 Aufgabe mit Teilaufgaben
Bearbeitungszeit in Minuten ca.: <5 bis 30 min>
Szenario: eines der Szenarien aus dem Bauplan

Vorgehen:
1. Lies zuerst die verlinkten Artikel. Kannst Du keine Webseiten
   abrufen, sag mir das, statt zu raten.
2. Steht bei einer Angabe noch ein Platzhalter in <…>, frag mich
   zuerst danach. Richte Punkte und Zahl der Teilaufgaben nach der
   Bearbeitungszeit (ca. 0,9 min je Punkt).
3. Gib je Aufgabe Titel mit Kompetenzstufe, Ausgangssituation und
   Teilaufgaben mit Operator und Punktzahl aus, dazu die geschätzte
   Bearbeitungszeit.
4. Gib die Beispiellösungen mit Punkteverteilung erst aus, wenn ich
   danach frage.

Aufgabe 3.1: Check-in am Barcamp-Terminal (Profilkompetenz)

(ca. 42 min Bearbeitungszeit)

Du bist Auszubildende*r Fachinformatiker*in für Anwendungsentwicklung und arbeitest im Entwicklungsteam des Ratz und Rübe Berufskollegs (RRB) in Bielefeld mit. Das Team unter der Leitung von Dimitrios Papadopoulos entwickelt die Software für das Barcamp „Lernen.Digital.Leben 2027“ am Samstag, 13.03.2027. Am Eingang stehen zwei Check-in-Terminals mit Badge-Druckern, die Emre Aksoy mit dem Technikteam betreut. Mia Schröder hat die Methode checkIn() geschrieben, die nach dem Scannen des QR-Codes einer Anmeldung aufgerufen wird. Du sollst die Methode mit Whitebox-Tests prüfen.

methode checkIn(badgeCode : String) : String
01  a = anmeldungen.suche(badgeCode)
02  wenn a == null dann
03      return "Code unbekannt – bitte zum Infostand"
04  ende wenn
05  wenn a.getCheckinZeit() != null dann
06      return "Bereits eingecheckt um " + a.getCheckinZeit()
07  ende wenn
08  a.setCheckinZeit(jetzt())
09  wenn a.getTicketart() == "Referent" dann
10      drucker.druckeBadge(a, "Referent*in")
11  sonst
12      drucker.druckeBadge(a, "Teilnehmer*in")
13  ende wenn
14  wenn a.getBedarfBarrierefreiheit() != null dann
15      infostand.benachrichtige(a.getBedarfBarrierefreiheit())
16  ende wenn
17  return "Willkommen, " + a.getVorname()
ende methode

Für die Tests steht eine Testdatenbank zur Verfügung, die vor jedem Testfall in den folgenden Zustand zurückgesetzt wird (Auszug aus der Tabelle anmeldung):

Testdaten der Tabelle anmeldung (– bedeutet null)
Badge-Code Person Ticketart Barrierefreiheitsbedarf Check-in-Zeit
BC27R005 Prof. Dr. Oluwaseun Adeyemi Referent – 13.03.2027 09:12
BC27S006 Fatma Öztürk Schueler – –
BC27E007 Gerhard Vogt Extern Rollator, Aufzug nötig –
BC27R008 Lisa Brandt Referent Live-Untertitelung (Schriftdolmetschung) –
BC27R013 Marco Brenner Referent – –

a) Beschreibe, was einen Whitebox-Test auszeichnet. (2 Punkte)

Bei einem Whitebox-Test werden die Testfälle bzw. Testdaten anhand der inneren Struktur des Quelltextes (Anweisungen, Verzweigungen, Pfade) ausgewählt; die Testenden kennen den Code. Ziel ist, bestimmte Teile des Codes nachweislich zu durchlaufen (Überdeckung). Beim Blackbox-Test werden die Testfälle dagegen nur aus der Spezifikation abgeleitet.

Bewertung: Testdaten aus der Codestruktur 2 Punkte (auch „Code ist bekannt und wird gezielt durchlaufen“).

b) In einem ersten Lauf meldet die Pipeline für checkIn() eine Anweisungsüberdeckung von 75 %. Mia Schröder freut sich: „Dann sind drei Viertel der Methode schon fehlerfrei.“ Beurteile Mias Aussage. Gib dazu an, wie der Wert berechnet wird und wie viele der ausführbaren Anweisungen von checkIn() er bedeutet. (3 Punkte)

Mias Aussage stimmt nicht. Der Anweisungsüberdeckungsgrad setzt die Anweisungen, die bei den Tests überhaupt durchlaufen wurden, ins Verhältnis zu allen ausführbaren Anweisungen:

C_0 = \frac{\text{Anzahl der von den Tests ausgeführten Anweisungen}}{\text{Anzahl aller ausführbaren Anweisungen}}

checkIn() hat 12 ausführbare Anweisungen (01, 02, 03, 05, 06, 08, 09, 10, 12, 14, 15, 17); 75 % heißt also, dass 9 davon bei mindestens einem Test gelaufen sind und 3 noch nie. Über die Korrektheit sagt der Wert nichts: Auch eine ausgeführte Anweisung kann falsch rechnen, wenn kein Test das Ergebnis prüft. Er zeigt nur, welcher Code noch gar nicht getestet wurde.

Bewertung: Berechnungsvorschrift 1 Punkt, 9 von 12 Anweisungen 1 Punkt, Begründung „ausgeführt heißt nicht korrekt“ 1 Punkt.

c) Jonas Wolff aus dem Testteam hat drei Testfälle vorbereitet. Gib für jeden Testfall der Reihe nach die Nummern der ausführbaren Anweisungen an, die er durchläuft. (6 Punkte)

Testfall Eingabe badgeCode erwartetes Ergebnis durchlaufene Anweisungen
T1 "BC27Z999" "Code unbekannt – bitte zum Infostand"
T2 "BC27R005" "Bereits eingecheckt um 13.03.2027 09:12"
T3 "BC27R008" Badge „Referent*in“, Infostand wird benachrichtigt, "Willkommen, Lisa"
Testfall durchlaufene Anweisungen
T1 01, 02, 03
T2 01, 02, 05, 06
T3 01, 02, 05, 08, 09, 10, 14, 15, 17

Bewertung: je Testfall 2 Punkte (je fehlender oder falscher Anweisung 1 Punkt Abzug). Die Zeilen 04, 07, 11, 13 und 16 sind keine ausführbaren Anweisungen.

d) Bestimme den Anweisungsüberdeckungsgrad, den die Testfälle T1 bis T3 gemeinsam erreichen. (3 Punkte)

Geg.: ausführbare Anweisungen 01, 02, 03, 05, 06, 08, 09, 10, 12, 14, 15, 17, also n = 12; von T1 bis T3 ausgeführt: 01, 02, 03, 05, 06, 08, 09, 10, 14, 15, 17, also k = 11

Ges.: Anweisungsüberdeckungsgrad C_0

C_0 = \frac{k}{n}

C_0 = \frac{11}{12} \approx 0{,}917 = \underline{\underline{91{,}667\,\%}}

Bewertung: Anzahl aller Anweisungen 1 Punkt, Anzahl ausgeführter Anweisungen 1 Punkt, Ergebnis 1 Punkt. Folgefehler aus c) werden nicht erneut abgezogen.

e) Nenne die Anweisung(en), die von den Testfällen T1 bis T3 nicht ausgeführt werden. (2 Punkte)

Anweisung 12 (drucker.druckeBadge(a, "Teilnehmer*in")) wird nicht ausgeführt, weil kein Testfall eine Anmeldung prüft, deren Ticketart nicht „Referent“ ist und die noch nicht eingecheckt ist.

Bewertung: Anweisung 12 1 Punkt, Begründung 1 Punkt.

f) Emre Aksoy ergänzt den Testfall T4 mit der Eingabe "BC27E007" (Gerhard Vogt).

fa) Bestimme für die Testfälle T1 bis T4 den Anweisungs- und den Zweigüberdeckungsgrad. (3 Punkte)

fb) Erkläre, warum trotz vollständiger Anweisungsüberdeckung keine vollständige Zweigüberdeckung erreicht wird. Ergänze einen Testfall T5 mit einem Badge-Code aus der Testdatenbank und seinem erwarteten Ergebnis, mit dem die Zweigüberdeckung vollständig wird, und begründe Deine Wahl. (4 Punkte)

fa) T4 durchläuft 01, 02, 05, 08, 09, 12, 14, 15, 17 und führt damit auch Anweisung 12 aus.

Geg.: n = 12 Anweisungen, davon ausgeführt k = 12; vier binäre Verzweigungen (Zeilen 02, 05, 09, 14) mit z = 8 Zweigen

Verzweigung ja-Zweig durchlaufen von nein-Zweig durchlaufen von
02 a == null T1 T2, T3, T4
05 bereits eingecheckt T2 T3, T4
09 Ticketart „Referent“ T3 T4
14 Barrierefreiheitsbedarf vorhanden T3, T4 – (fehlt)

Ges.: Anweisungsüberdeckungsgrad C_0, Zweigüberdeckungsgrad C_1

C_0 = \frac{k}{n} = \frac{12}{12} = \underline{\underline{100\,\%}}

C_1 = \frac{\text{durchlaufene Zweige}}{z} = \frac{7}{8} = 0{,}875 = \underline{\underline{87{,}500\,\%}}

Bewertung: C_0 1 Punkt, C_1 2 Punkte.

fb) Die Verzweigung in Zeile 14 hat keinen sonst-Teil. Ihr nein-Zweig ist leer und enthält keine Anweisung, deshalb wird er für die Anweisungsüberdeckung nicht benötigt. Weil T3 und T4 beide einen Barrierefreiheitsbedarf haben, wurde nie getestet, ob die Methode auch ohne Benachrichtigung des Infostands richtig arbeitet.

Ergänzung: T5 mit "BC27S006" (Fatma Öztürk, Ticketart Schueler, kein Bedarf, noch nicht eingecheckt). Erwartetes Ergebnis: Badge „Teilnehmer*in“ wird gedruckt, der Infostand wird nicht benachrichtigt, Rückgabe "Willkommen, Fatma". Alternativ ist "BC27R013" (Marco Brenner, Referent ohne Bedarf; Badge „Referent*in“, "Willkommen, Marco") richtig. Begründung: Die Anmeldung muss existieren, darf noch nicht eingecheckt sein und darf keinen Barrierefreiheitsbedarf haben, damit Zeile 14 mit nein ausgewertet wird. "BC27R005" eignet sich nicht, weil die Methode schon in Zeile 06 endet.

Bewertung: Erklärung leerer Zweig 2 Punkte, passender Testfall mit erwartetem Ergebnis 1 Punkt, Begründung 1 Punkt.

g) Die Barcamp-Software liegt in einem öffentlichen Repository, an dem auch Freiwillige aus anderen Schulen mitarbeiten. Deshalb hat das Team seine Regeln in der Datei CONTRIBUTING.md auf Englisch festgehalten. Abschnitt 4 lautet:

4 Coverage gate

4.1 The pipeline measures coverage for every file you change. Your merge request is blocked if a changed file is below the limits for its package:

  • checkin: statement coverage 100 %, branch coverage 100 %
  • programm (session planning): statement coverage 90 %, branch coverage 80 %
  • export: statement coverage 80 %, no branch limit

4.2 An if without an else still has two branches. Add a test in which its condition is false.

4.3 In the package checkin, every method without a loop needs one test per path. Name the paths in the description of your merge request. Methods with loops are exempt.

4.4 Reviewers reject tests without assertions, even if they raise the coverage.

Mia Schröder reicht ihre Änderung an checkIn() (Paket checkin) zusammen mit den Testfällen T1 bis T4 aus c) und f) ein. Jeder dieser Tests prüft den Rückgabewert mit einer Assertion. Entscheide anhand von Abschnitt 4, ob der Merge Request angenommen wird. Nenne jede Regel, gegen die er verstößt, und gib an, was Mia nachliefern muss. (6 Punkte)

Der Merge Request wird nicht angenommen.

  • Regel 4.1: checkIn() gehört zum Paket checkin. Die Anweisungsüberdeckung liegt mit T1 bis T4 bei 100 %, die Zweigüberdeckung aber nur bei 87,5 % (siehe fa). Verlangt sind 100 %, also blockiert die Pipeline.
  • Regel 4.2: Genau das fehlt: Das wenn in Zeile 14 hat keinen sonst-Teil, und kein Test wertet seine Bedingung mit nein aus.
  • Regel 4.3: checkIn() enthält keine Schleife, also ist je Pfad ein Test nötig. Die Methode hat 6 Pfade (siehe h); T1 bis T4 durchlaufen nur 4 davon (unbekannt, bereits eingecheckt, Referent*in mit Bedarf, Teilnehmer*in mit Bedarf). In der Beschreibung fehlt außerdem die Liste der Pfade.
  • Regel 4.4 ist erfüllt, weil jeder Test eine Assertion enthält.

Nachliefern muss Mia zwei Tests ohne Barrierefreiheitsbedarf – einen für eine Referent*in (z. B. "BC27R013") und einen für eine Teilnehmer*in (z. B. "BC27S006") – sowie die Liste der 6 Pfade in der Beschreibung. Mit den beiden Tests sind auch 100 % Zweigüberdeckung erreicht.

Bewertung: Entscheidung mit Regel 4.1 und Zahlenwert 2 Punkte, Bezug zu Regel 4.2 1 Punkt, Regel 4.3 mit fehlenden Pfaden 2 Punkte, passende Nachlieferung 1 Punkt.

h) Dimitrios Papadopoulos möchte die Methode checkIn() vollständig nach Pfaden testen lassen.

ha) Berechne, wie viele Pfade es durch checkIn() gibt, ohne die Pfade einzeln aufzuschreiben. Erläutere, warum vier Verzweigungen mit je zwei Ausgängen hier nicht 2^4 = 16 Pfade ergeben. (4 Punkte)

hb) Bestimme den Pfadüberdeckungsgrad, den die Testfälle T1 bis T5 erreichen, und beschreibe den noch fehlenden Pfad über die Ergebnisse der Verzweigungen in den Zeilen 09 und 14. (4 Punkte)

ha) Die Verzweigungen in den Zeilen 02 und 05 beenden die Methode im ja-Fall sofort mit return. Jede von ihnen liefert deshalb genau einen eigenen Pfad und teilt den weiteren Ablauf nicht auf. Erst wenn beide mit nein durchlaufen werden, folgen die Verzweigungen in den Zeilen 09 und 14. Sie liegen unabhängig hintereinander, ihre Ausgänge lassen sich also beliebig kombinieren:

p = 1 + 1 + 2 \cdot 2 = \underline{\underline{6}}

Der Kontrollflussgraph zeigt die Struktur: Die beiden ja-Zweige der Zeilen 02 und 05 führen direkt zum Ende, erst danach verzweigt der Ablauf zweimal unabhängig voneinander.

Kontrollflussgraph der Methode checkIn(): Die Verzweigungen in Zeile 02 und 05 enden im ja-Fall mit return (Pfade 1 und 2), danach folgen die unabhängigen Verzweigungen in Zeile 09 und 14 mit 2 · 2 Kombinationen (Pfade 3 bis 6) (mit KI erstellt)

16 Pfade gäbe es nur, wenn alle vier Verzweigungen hintereinander durchlaufen würden, ohne dass eine die Methode vorzeitig beendet. Zur Kontrolle die sechs Pfade (die Nummern werden in i) verwendet):

Nr. Pfad Fall
1 01, 02, 03 Code unbekannt
2 01, 02, 05, 06 bereits eingecheckt
3 01, 02, 05, 08, 09, 10, 14, 15, 17 Referent*in mit Bedarf
4 01, 02, 05, 08, 09, 10, 14, 17 Referent*in ohne Bedarf
5 01, 02, 05, 08, 09, 12, 14, 15, 17 Teilnehmer*in mit Bedarf
6 01, 02, 05, 08, 09, 12, 14, 17 Teilnehmer*in ohne Bedarf

Bewertung: zwei vorzeitige Pfade 1 Punkt, Kombination der Zeilen 09 und 14 1 Punkt, Ergebnis 6 1 Punkt, Erläuterung zu 16 1 Punkt. Eine richtige Aufzählung aller Pfade mit Zählung ist ebenfalls volle Punktzahl wert.

hb)

Geg.: p = 6 Pfade; T1 durchläuft Pfad 1, T2 Pfad 2, T3 Pfad 3, T4 Pfad 5, T5 Pfad 6 (mit "BC27S006") bzw. Pfad 4 (mit "BC27R013"), also d = 5 verschiedene Pfade

Ges.: Pfadüberdeckungsgrad C_2

C_2 = \frac{d}{p}

C_2 = \frac{5}{6} \approx 0{,}833 = \underline{\underline{83{,}333\,\%}}

Es fehlt der Pfad, der Zeile 09 mit ja und Zeile 14 mit nein durchläuft (Referent*in ohne Barrierefreiheitsbedarf, Pfad 4), wenn T5 mit "BC27S006" gewählt wurde. Wurde T5 mit "BC27R013" gewählt, fehlt der Pfad mit Zeile 09 nein und Zeile 14 nein (Teilnehmer*in ohne Bedarf, Pfad 6).

Bewertung: Anzahl durchlaufener Pfade 1 Punkt, Ergebnis 1 Punkt, fehlender Pfad mit beiden Verzweigungsergebnissen 2 Punkte.

i) Bestimme für die Methode checkIn() jeweils die Mindestanzahl an Testfällen, die für eine vollständige Anweisungs-, Zweig- und Pfadüberdeckung nötig ist, und begründe Deine Angaben kurz. (6 Punkte)

  • Anweisungsüberdeckung: 4 Testfälle. Die Anweisungen 03 und 06 liegen auf Pfaden, die vorzeitig enden; dafür sind zwei eigene Testfälle nötig. Die Anweisungen 10 und 12 schließen sich gegenseitig aus, also werden zwei weitere Testfälle benötigt, die bis Zeile 17 laufen; Anweisung 15 kann in einem davon mit ausgeführt werden (z. B. Pfade 1, 2, 3 und 6).

  • Zweigüberdeckung: 4 Testfälle. Wie oben braucht man zwei Testfälle für die ja-Zweige der Zeilen 02 und 05. Die beiden durchlaufenden Testfälle müssen zusammen die Zweige von Zeile 09 und Zeile 14 je einmal mit ja und nein abdecken, z. B. Pfade 3 und 6 oder Pfade 4 und 5.

  • Pfadüberdeckung: 6 Testfälle, weil jeder Testfall genau einen Pfad durchläuft und es 6 Pfade gibt.

Bewertung: je Maß 1 Punkt für die Anzahl und 1 Punkt für die Begründung.

j) Nach der Diskussion schlägt Dimitrios Papadopoulos vor, für die gesamte Barcamp-Software künftig eine vollständige Pfadüberdeckung vorzuschreiben. Nimm begründet Stellung und nenne, welches Überdeckungsmaß Du für checkIn() und welches für die übrige Software vorschlägst. (3 Punkte)

Für checkIn() ist eine Pfadüberdeckung machbar und sinnvoll: Die Methode hat keine Schleife, nur 6 Pfade und ist für den Einlass am Veranstaltungstag kritisch; Pfadtests prüfen auch die Kombinationen aus Ticketart und Barrierefreiheitsbedarf. Für die gesamte Software ist eine vollständige Pfadüberdeckung nicht realistisch, weil viele Methoden Schleifen enthalten (z. B. über alle Räume, Slots oder Anmeldungen) und jeder weitere Schleifendurchlauf neue Pfade erzeugt; die Zahl der Pfade ist praktisch unbegrenzt. Als verbindliches Mindestmaß bietet sich die Zweigüberdeckung an (wie in der Richtlinie aus g für die Pakete checkin und programm), ergänzt um Pfadtests für kurze, kritische Methoden und um Blackbox-Tests mit Grenzwerten.

Bewertung: Einschätzung für checkIn() mit Begründung 1 Punkt, Ablehnung für die gesamte Software mit Begründung (Schleifen) 1 Punkt, Vorschlag Zweigüberdeckung 1 Punkt. Andere schlüssig begründete Stellungnahmen sind möglich.

Aufgabe 3.2: Kostenbeiträge in der Mitfahr-App prüfen (Profilkompetenz)

(ca. 33 min Bearbeitungszeit)

Du bist Auszubildende*r Fachinformatiker*in für Anwendungsentwicklung im Projektteam der Mitfahr-App „RatzFahrt“ des Ratz und Rübe Berufskollegs. Fahrer*innen dürfen für eine Fahrt höchstens 0,10 € je Kilometer und mitfahrender Person verlangen, damit niemand mit der App Gewinn erzielt. Die Datenschutzbeauftragte und Administratorin Andrea Wolf möchte zu hohe Kostenbeiträge automatisch markieren lassen. Oksana Melnyk hat dazu die Methode zuHoheBeitraege() geschrieben. Die Methode getEntfernungKm() liefert die Entfernung des Haltepunkts zur Schule in km.

methode zuHoheBeitraege(angebote : Liste<Angebot>) : Liste<Angebot>
01  auffaellig = neue Liste<Angebot>()
02  für jedes a in angebote
03      wenn a.getStatus() != "abgesagt" und a.getEntfernungKm() > 0 dann
04          grenze = a.getEntfernungKm() * 0.10
05          wenn a.getKostenbeitrag() > grenze dann
06              auffaellig.hinzufuegen(a)
07              a.setHinweis("Kostenbeitrag über 0,10 € je km")
08          ende wenn
09      ende wenn
10  ende für
11  return auffaellig
ende methode

Für die Tests stehen folgende Angebote aus dem Datenbestand zur Verfügung:

Angebote für die Testfälle
Angebot Fahrer*in Haltepunkt (Entfernung) Kostenbeitrag Status
1 Ben Richter Gütersloh, Hauptbahnhof (18,6 km) 1,80 € offen
3 Jonas Wolff Halle (Westf.), Marktplatz (15,2 km) 1,50 € voll
4 Marie Schulz Herford, Park & Ride (17,9 km) 1,70 € offen
5 Niklas Fischer Bad Salzuflen, Busbahnhof (19,4 km) 2,50 € offen
7 Marie Schulz Herford, Park & Ride (17,9 km) 1,70 € abgesagt

Jonas Wolff hat einen ersten Testfall T1 geschrieben: Die Methode wird mit der Liste [Angebot 1, Angebot 4] aufgerufen; erwartet wird eine leere Liste.

a) Bestimme den Anweisungsüberdeckungsgrad von T1 und erläutere, woran es liegt, dass er unter 100 % bleibt. (3 Punkte)

Geg.: ausführbare Anweisungen 01, 02, 03, 04, 05, 06, 07, 11, also n = 8; von T1 ausgeführt 01, 02, 03, 04, 05, 11, also k = 6

Ges.: Anweisungsüberdeckungsgrad C_0

C_0 = \frac{k}{n}

C_0 = \frac{6}{8} = 0{,}75 = \underline{\underline{75{,}000\,\%}}

Es fehlen die Anweisungen 06 und 07, weil in T1 kein Kostenbeitrag über seiner Grenze liegt (Angebot 1: 1,80 € bei einer Grenze von 1,86 €; Angebot 4: 1,70 € bei 1,79 €). Die Bedingung in Zeile 05 ist deshalb nie erfüllt.

Bewertung: Ergebnis mit Rechenweg 2 Punkte, Begründung über Zeile 05 1 Punkt.

b) Oksana Melnyk schlägt vor: „Ein zweiter Testfall nur mit Angebot 3 bringt uns auf 100 %.“ Prüfe ihren Vorschlag rechnerisch. (3 Punkte)

Angebot 3 ist nicht abgesagt (Status „voll“) und hat eine Entfernung über 0 km, Zeile 03 ist also erfüllt. Die Grenze beträgt 15,2 km · 0,10 €/km = 1,52 €. Der Kostenbeitrag von 1,50 € liegt darunter, Zeile 05 ist nicht erfüllt. Die Anweisungen 06 und 07 laufen also wieder nicht, der Überdeckungsgrad von T1 und dem neuen Testfall zusammen bleibt bei 6/8 = 75\,\%. Der Vorschlag hilft nicht.

Bewertung: Grenze berechnet 1 Punkt, Vergleich mit dem Kostenbeitrag 1 Punkt, Schlussfolgerung 1 Punkt.

c) Gib einen Testfall T2 an, dessen Liste aus genau einem Angebot der Tabelle besteht und der die Anweisungen 06 und 07 ausführt. Nenne das erwartete Ergebnis. (3 Punkte)

T2: Aufruf mit der Liste [Angebot 5].

Angebot 5 ist nicht abgesagt und 19,4 km entfernt, die Grenze liegt bei 19,4 km · 0,10 €/km = 1,94 €. Der Kostenbeitrag von 2,50 € ist höher, also werden 06 und 07 ausgeführt.

Erwartetes Ergebnis: eine Liste, die genau Angebot 5 enthält; Angebot 5 trägt danach den Hinweis „Kostenbeitrag über 0,10 € je km“.

Bewertung: passendes Angebot 1 Punkt, Begründung mit Grenze 1 Punkt, erwartetes Ergebnis 1 Punkt.

d) Bestimme den Anweisungsüberdeckungsgrad, den T1 und T2 gemeinsam erreichen. Jonas Wolff meint, T1 könne man nun löschen. Beurteile seinen Vorschlag. (3 Punkte)

T1 und T2 führen zusammen alle 8 Anweisungen aus: C_0 = 8/8 = 100\,\%. Tatsächlich erreicht T2 die 100 % sogar allein, weil die Schleife schon bei einem einzigen Element jede Anweisung einmal durchläuft. Für die Anweisungsüberdeckung ist T1 also überflüssig.

Löschen sollte man ihn trotzdem nicht: Nur T1 prüft den Fall, dass ein Kostenbeitrag nicht zu hoch ist und das Angebot unmarkiert bleibt. Dieser leere sonst-Zweig von Zeile 05 enthält keine Anweisung und taucht in der Anweisungsüberdeckung deshalb nicht auf; ohne T1 würde ein Fehler, der jedes Angebot markiert, nicht bemerkt.

Bewertung: 100 % 1 Punkt, T2 allein genügt für C_0 1 Punkt, Begründung für den Erhalt von T1 1 Punkt.

e) Die Methode enthält drei Verzweigungen mit je zwei Zweigen.

ea) Trage in die Tabelle ein, ob die Testfälle T1 und T2 zusammen den jeweiligen Zweig durchlaufen. (3 Punkte)

Zeile Zweig durchlaufen (ja/nein)
02 Schleifenrumpf wird betreten (es gibt ein weiteres Angebot)
02 Schleife wird verlassen (kein weiteres Angebot)
03 Bedingung erfüllt
03 Bedingung nicht erfüllt
05 Kostenbeitrag zu hoch
05 Kostenbeitrag nicht zu hoch

eb) Stelle aus den Angeboten der Tabelle einen einzigen Testfall T3 zusammen, der eine vollständige Zweigüberdeckung erreicht, gib das erwartete Ergebnis an und begründe, warum für diese Methode ein Testfall genügt. (3 Punkte)

ea)

Zeile Zweig durchlaufen
02 Schleifenrumpf wird betreten ja
02 Schleife wird verlassen ja
03 Bedingung erfüllt ja (Angebote 1, 4, 5)
03 Bedingung nicht erfüllt nein
05 Kostenbeitrag zu hoch ja (Angebot 5)
05 Kostenbeitrag nicht zu hoch ja (Angebote 1, 4)

Bewertung: je zwei richtige Zeilen 1 Punkt.

eb) T3: [Angebot 1, Angebot 4, Angebot 5, Angebot 7]. Gegenüber T1 und T2 kommt das abgesagte Angebot 7 hinzu; für dieses Angebot ist die Bedingung in Zeile 03 nicht erfüllt. Damit sind alle 6 Zweige durchlaufen (C_1 = 6/6 = 100\,\%). Erwartet wird eine Liste, die genau Angebot 5 enthält.

Ein Testfall genügt, weil die Schleife für jedes Angebot der Liste einmal durchlaufen wird und die verschiedenen Angebote dabei verschiedene Zweige nehmen. Kürzer geht es auch mit [Angebot 5, Angebot 7, Angebot 1].

Bewertung: passende Liste mit Angebot 7 1 Punkt, erwartetes Ergebnis 1 Punkt, Begründung über die Schleifendurchläufe 1 Punkt.

f) Die Bedingung in Zeile 03 setzt sich aus zwei Teilbedingungen zusammen. Erläutere den Unterschied zwischen Zweig- und Bedingungsüberdeckung an dieser Zeile und nenne die Testdaten, die zusätzlich zu Deinen Testdaten aus eb) nötig sind, damit jede Teilbedingung mindestens einmal wahr und einmal falsch ist. (4 Punkte)

Die Zweigüberdeckung betrachtet nur das Gesamtergebnis der Bedingung in Zeile 03: Es genügt, dass sie einmal wahr und einmal falsch ist. Die Bedingungsüberdeckung verlangt, dass jede atomare Teilbedingung (a.getStatus() != "abgesagt" und a.getEntfernungKm() > 0) für sich einmal wahr und einmal falsch ausgewertet wird.

Mit den Testdaten aus eb) ist die erste Teilbedingung wahr (Angebote 1, 4, 5) und falsch (Angebot 7). Die zweite Teilbedingung ist nur wahr; bei Angebot 7 wird sie wegen der Kurzschlussauswertung von und gar nicht erst geprüft. Zusätzlich nötig ist daher ein nicht abgesagtes Angebot mit einer Entfernung von 0 km (z. B. ein eigens angelegtes Testangebot an einem Haltepunkt, dessen Entfernung fehlerhaft mit 0 km gepflegt ist). Erwartet wird, dass dieses Angebot nicht in der Ergebnisliste erscheint.

Bewertung: Unterschied 2 Punkte, zusätzliches Testangebot mit Begründung 2 Punkte.

g) Formuliere den Testfall aus eb) als Unit-Test in Pseudocode oder in einer Programmiersprache Deiner Wahl. Gliedere den Test in Vorbereitung, Ausführung und Prüfung und prüfe sowohl die Ergebnisliste als auch die Hinweise der Angebote. Du kannst annehmen, dass die Angebote über testdaten.angebot(nr) geladen werden und getHinweis() ohne gesetzten Hinweis null liefert. (6 Punkte)

Lösung in Java mit JUnit 5 bzw. in Python mit pytest (Pseudocode mit gleichem Aufbau ist ebenso richtig):

@Test
void zuHoheBeitraege_markiertNurZuHohenBeitrag() {
    // given: Vorbereitung
    Angebot a1 = testdaten.angebot(1);
    Angebot a4 = testdaten.angebot(4);
    Angebot a5 = testdaten.angebot(5);
    Angebot a7 = testdaten.angebot(7);
    List<Angebot> angebote = List.of(a1, a4, a5, a7);

    // when: Ausführung
    List<Angebot> ergebnis = pruefung.zuHoheBeitraege(angebote);

    // then: Prüfung
    assertEquals(1, ergebnis.size());
    assertTrue(ergebnis.contains(a5));
    assertEquals("Kostenbeitrag über 0,10 € je km", a5.getHinweis());
    assertNull(a1.getHinweis());
    assertNull(a4.getHinweis());
    assertNull(a7.getHinweis());
}

Bewertung: Vorbereitung der Liste mit den vier Angeboten 1 Punkt, Aufruf der Methode 1 Punkt, Prüfung der Listenlänge bzw. des Inhalts 2 Punkte, Prüfung der Hinweise 1 Punkt, sinnvoller Testname bzw. Gliederung 1 Punkt.

h) Thomas Becker, der die Schule im Projekt vertritt, wünscht für diese Methode eine vollständige Pfadüberdeckung. Begründe, warum das hier nicht realistisch ist, und nenne ein geeignetes Überdeckungsmaß mit Begründung. (4 Punkte)

Jeder Schleifendurchlauf kann auf drei Wegen verlaufen (Zeile 03 nicht erfüllt; Zeile 03 erfüllt und Zeile 05 nicht erfüllt; beide erfüllt). Bei einer Liste mit n Angeboten gibt es daher 3^n Pfade, schon bei bis zu zwei Angeboten 1 + 3 + 9 = 13. Da die Länge der Liste nicht begrenzt ist, ist die Zahl der Pfade unbegrenzt; eine vollständige Pfadüberdeckung ist nicht erreichbar und der Pfadüberdeckungsgrad nicht einmal bestimmbar.

Geeignet ist die Zweigüberdeckung: Sie ist mit einem einzigen Testfall vollständig erreichbar, prüft auch die leeren sonst-Zweige der Zeilen 03 und 05 und schließt die Anweisungsüberdeckung ein. Sinnvoll ergänzt wird sie durch Tests mit 0, 1 und mehreren Angeboten (leere Liste, ein Element, viele Elemente).

Bewertung: Begründung über die Schleife 2 Punkte, Zweigüberdeckung mit Begründung 2 Punkte.

i) Andrea Wolf liest im Testbericht „Zweigüberdeckung 100 %“ und fragt: „Dann ist die Prüfung der Kostenbeiträge also fehlerfrei?“ Nimm Stellung und erläutere Deine Antwort an einem Beispiel aus der Methode. (4 Punkte)

Nein. Eine Zweigüberdeckung von 100 % zeigt nur, dass jeder Zweig durchlaufen wurde, nicht, dass die Methode richtig rechnet. Ob ein Fehler auffällt, hängt von den gewählten Testdaten und den Prüfungen (Assertions) ab.

Beispiel: Stünde in Zeile 05 versehentlich >= statt >, würde ein Kostenbeitrag von genau 0,10 € je km fälschlich als zu hoch markiert. Alle bisherigen Tests bestünden trotzdem, weil keines der Angebote genau auf der Grenze liegt (1,80 € < 1,86 €; 2,50 € > 1,94 €). Erst ein Grenzwerttest aus der Blackbox-Sicht, z. B. 1,94 € bei 19,4 km, deckt den Fehler auf. (Vorsicht bei der Umsetzung mit Gleitkommazahlen: 19,4 · 0,10 ergibt in Java und Python zwar genau den double-Wert von 1,94, 18,6 · 0,10 aber 1,8600000000000003. Ein Grenzwerttest mit 1,86 € bei 18,6 km fände den Fehler deshalb auch mit >= nicht. Geldbeträge rechnet man besser in ganzen Cent oder mit BigDecimal, und für Grenzwerttests wählt man Werte, deren Ergebnis man nachgeprüft hat, etwa 1,94 € bei 19,4 km oder 2,00 € bei 20 km.) Ebenso kann ein Whitebox-Test keine fehlende Anforderung finden: Angebote mit einer Entfernung von 0 km werden stillschweigend übergangen; ob sie stattdessen als Datenfehler gemeldet werden sollen, muss mit Andrea Wolf geklärt werden.

Bewertung: Stellungnahme mit Begründung 2 Punkte, passendes Beispiel 2 Punkte.


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zu Whitebox-Tests und Überdeckungsmaßen” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/whitebox-ueberdeckung-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/qs/testen. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 28.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: