Whitebox-Übungsaufgabe “Sortierung”: Kontrollflussgraph, McCabe-Zahl und Überdeckung

https://bildung.social/@oerinformatik/111523080351425661

https://oer-informatik.de/whitebox-testfall-uebung-sortierung

Whitebox-Test, Kontrollflussgraph, McCabe-Zahl, Zyklomatische Komplexität, Anweisungsüberdeckung, Zweigüberdeckung, Blackbox-Test, JaCoCo, Sortieralgorithmus, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (ca. 22 min Lese- und Bearbeitungszeit): Zu einer gegebenen Funktion (ein Sortieralgorithmus) soll ein Kontrollflussgraph erstellt werden, die McCabe-Zahl berechnet werden (beides optional), die Überdeckungsmetriken für einen bestehenden Test berechnet werden, weitere Tests aus Whitebox-Sicht ergänzt werden und alles mit einem Code-Coverage-Tool implementiert werden [AI-Assisted]. (Zuletzt geändert am 29.10.2026)

Diese Übung gehört zu einer Reihe über Whitebox-Tests: Was steckt in der Whitebox? (Grundlagenartikel) / Leitfragen zur Whitebox-Systematik / Übung „ShippingCost“ / Übung „Rabatt“ / Übung „Sortierung“ / Übungsaufgaben zu Whitebox-Tests und Überdeckungsmaßen

Die Aufgaben beziehen sich auf die Inhalte der folgenden Blogposts:

Die Teilaufgaben führen Schritt für Schritt vom Quelltext zur werkzeuggestützten Überdeckungsmessung:

Ablauf der Übung: Quelltext von sortiere(), Kontrollflussgraph zeichnen, McCabe-Zahl berechnen, Blackbox-Testfälle ergänzen, Überdeckungsgrade C0 und C1 berechnen, Ergebnisse mit JaCoCo prüfen (mit KI erstellt)

Hinweise zur Bearbeitung: Von FIA wird erwartet, dass ihnen Aufgaben auf Profilkompetenz-Ebene (Aufgabe 3.1) keine Probleme bereiten. Bearbeite jede Teilaufgabe schriftlich, bevor Du die Beispiellösung aufklappst. Die Teilaufgaben a) und b) sind optional; für d) hilft Dir aber ein eigener Kontrollflussgraph. Arrays werden in den Testfällen abgekürzt notiert: [2;3;1] steht für das Java-Array new int[]{2, 3, 1}.

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-Übungsaufgabe
"Sortierung": Kontrollflussgraph, McCabe-Zahl und Überdeckung“.

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/zyklomatische-komplexitaet
- https://oer-informatik.de/blackboxtests
- Stilbeispiel: https://oer-informatik.de/whitebox-testfall-uebung-sortierung

Die Aufgaben sollen Inhalte zu diesen Schlagwörtern abdecken:
- Whitebox-Test
- Kontrollflussgraph
- McCabe-Zahl
- Zyklomatische Komplexität
- Anweisungsüberdeckung
- Zweigüberdeckung
- Blackbox-Test
- JaCoCo
- Sortieralgorithmus

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: Überdeckungstests für einen Sortieralgorithmus (Profilkompetenz)

Im Folgenden ist eine Beispielimplementierung für einen Sortier-Algorithmus abgebildet:

public static int[] sortiere(int[] sortieren) {
  for (int i = 0; i < sortieren.length - 1; i++) {
    for (int j = i + 1; j < sortieren.length; j++) {
      if (sortieren[i] > sortieren[j]) {
        int temp = sortieren[i];
        sortieren[i] = sortieren[j];
        sortieren[j] = temp;
      }
    }
  }
  return sortieren;
}

a) Erstelle für diese Methode einen Kontrollflussgraphen! (4 Punkte)

Hinweis: In dieser Beispiellösung heißt die Methode anders (selectionSort), der Kontrollflussgraph passt aber. Knoten 1 ist die Initialisierung i = 0, Knoten 2 die Bedingung der äußeren Schleife, 3 das i++, 4 die Initialisierung j = i + 1, 5 die Bedingung der inneren Schleife, 6 das j++, 7 die if-Bedingung, 8 der Tausch und 9 das return.

Kontrollflussgraph mit 9 Knoten

b) Berechne die Zyklomatische Komplexität (McCabe-Zahl)! (2 Punkte)

Die McCabe-Zahl M lässt sich am einfachsten über die Anzahl der binären Verzweigungen (b) berechnen: Im Kontrollflussgraphen oben haben die Knoten 2, 5 und 7 je zwei ausgehende Kanten (b=3).

M = b + 1 = 4

Über Kanten und Knoten ergibt sich dasselbe: M = e - n + 2 = 11 - 9 + 2 = 4.

Hintergrund: Artikel zur McCabe-Zahl

c) Welche Testfälle erhältst Du aus Blackbox-Sicht für diesen Algorithmus? Erstelle für jede Blackbox-Systematik zwei Testfälle und dokumentiere die erforderlichen Informationen für die Testfälle tabellarisch! (6 Punkte)

Blackbox-Testfälle für sortiere()
Testfall
Nr.
Beschreibender Name der Testklasse / des Testfalls Vor-
bedingungen
Eingabewerte
(Parameter sortieren)
Erwartetes
Resultat
Nach-
bedingungen
Tatsächliches
Resultat (*)
bestanden
/ nicht bestanden (*)
1. ÄK: Unsortiertes Array keine sortiere([2;3;1]) [1;2;3] -
2. ÄK: bereits sortiertes Array keine sortiere([3;4;5]) [3;4;5] -
3. GW: Leeres Array keine sortiere([]) [] -
4. GW: Array mit einem Element keine sortiere([7]) [7] -
5. ÄK (ungültig): kein Array keine sortiere(null) NullPointerException -

(*) Wird beim Ausführen der Tests ausgefüllt. ÄK: Äquivalenzklasse, GW: Grenzwert. Der Testfall mit null gehört zu einer ungültigen Äquivalenzklasse, nicht zu den Grenzwerten.

d) Es liegt nur der folgende Testfall vor:

@Test
public void sortiere_321_Test() {
    int[] result = App.sortiere(new int[]{3, 2, 1});
    assertArrayEquals(new int[]{1, 2, 3}, result);
}

Berechne den Anweisungsüberdeckungsgrad und den Zweigüberdeckungsgrad! Gib die Werte in der Form xx von yy (oder als nicht gekürzten Bruch) an, nicht als Prozentzahl. (4 Punkte)

Anhand des Kontrollflussgraphen – am besten selbst nachzeichnen und alle durchlaufenen Anweisungen und Kanten kennzeichnen. Bei [3;2;1] ist der Vergleich sortieren[i] > sortieren[j] in allen drei Durchläufen wahr (es wird jedes Mal getauscht), der false-Ausgang von Knoten 7 wird also nie genommen.

Kontrollflussgraph mit 9 Knoten, durchlaufene Kanten rot markiert, daneben ein Schreibtischtest; die Kante 7-6 wird nicht durchlaufen

Anweisungsüberdeckung: C_0=\frac{9}{9}=100\,\%

Über Zweige: Die drei Verzweigungen (Knoten 2, 5 und 7) haben 6 Zweige, Zweig 7-6 wird nicht durchlaufen.

Zweigüberdeckung: C_1=\frac{5}{6}\approx 83\,\%

Über Kanten: Von 11 Kanten wird Kante 7-6 nicht durchlaufen.

Kantenüberdeckung: C_1=\frac{10}{11}\approx 91\,\%

e) Übernimm die Methode in eine IDE und erstelle die entworfenen Testfälle als JUnit-Tests. Überprüfe Deine Ergebnisse mit JaCoCo. Als Vorlage für ein Maven-Projekt mit JUnit 5 und JaCoCo kannst Du das Beispielprojekt jacoco-metrik-bubblesort nutzen (es enthält einen anderen Sortieralgorithmus); mvn test erzeugt den Bericht unter target/site/jacoco/index.html. (8 Punkte)

Die Testklasse mit dem Testfall aus d) und den Testfällen aus c) kann z. B. so aussehen (die Methode steht in der Klasse App):

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.Test;

public class AppTest {
    @Test
    public void sortiere_321_Test() {
        assertArrayEquals(new int[]{1, 2, 3}, App.sortiere(new int[]{3, 2, 1}));
    }

    @Test
    public void sortiere_unsortiert_Test() {
        assertArrayEquals(new int[]{1, 2, 3}, App.sortiere(new int[]{2, 3, 1}));
    }

    @Test
    public void sortiere_bereitsSortiert_Test() {
        assertArrayEquals(new int[]{3, 4, 5}, App.sortiere(new int[]{3, 4, 5}));
    }

    @Test
    public void sortiere_leer_Test() {
        assertArrayEquals(new int[]{}, App.sortiere(new int[]{}));
    }

    @Test
    public void sortiere_einElement_Test() {
        assertArrayEquals(new int[]{7}, App.sortiere(new int[]{7}));
    }

    @Test
    public void sortiere_null_Test() {
        assertThrows(NullPointerException.class, () -> App.sortiere(null));
    }
}

Mit dem Testfall aus d) allein meldet JaCoCo 100 % der Anweisungen, aber nur 5 von 6 Zweigen: JaCoCo zählt wie wir je zwei Zweige für die beiden Schleifenbedingungen und die if-Verzweigung. Sobald ein Testfall einen Vergleich ohne Tausch enthält (z. B. das bereits sortierte Array aus c)), sind alle 6 Zweige erreicht. Die Komplexität (Spalte „Cxty“) entspricht mit 4 der McCabe-Zahl aus b).


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: “Whitebox-Übungsaufgabe ”Sortierung”: Kontrollflussgraph, McCabe-Zahl und Überdeckung” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/whitebox-testfall-uebung-sortierung 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: 29.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: