Eine Softwareänderung mit passenden Testfällen absichern
Du leitest aus einer Anforderung Normal-, Rand- und Fehlerfälle ab, strukturierst automatisierte Tests und dokumentierst Befunde reproduzierbar.
Eine kleine Änderung mit großer Wirkung
Die Lernwerk GmbH betreibt eine Software, mit der Beschäftigte interne Schulungsplätze buchen. Bisher durfte eine Buchung zwischen 1 und 8 Plätzen enthalten. Nun sollen Teamleitungen bis zu 12 Plätze in einer Buchung reservieren können. Für alle anderen Personen bleibt die Obergrenze bei 8.
Die neue Anforderung lautet:
Eine Buchung wird angenommen, wenn mindestens ein Platz angefragt wird und die Anzahl die Obergrenze der Rolle nicht überschreitet. Teamleitungen dürfen höchstens 12 Plätze buchen, andere Beschäftigte höchstens 8. Ungültige Rollen und nicht-ganzzahlige Platzangaben werden abgewiesen.
Eine Entwicklerin passt die Funktion an. Ein Test nur mit 3 Plätzen und der Rolle employee wird wahrscheinlich weiterhin erfolgreich sein. Er beantwortet aber nicht die entscheidenden Fragen: Gilt die neue Obergrenze wirklich nur für Teamleitungen? Werden 12 und 13 richtig unterschieden? Was passiert bei 0, einer Kommazahl oder einer unbekannten Rolle?
Genau hier beginnt systematisches Testen. Du leitest zuerst aus der Anforderung beobachtbare Bedingungen ab. Danach wählst du Daten, mit denen jede Bedingung sichtbar wird. Erst dann entscheidest du, welche Prüfungen du automatisierst.
Für die Codebeispiele solltest du Bedingungen, Funktionen und Rückgabewerte grundsätzlich lesen können. Die genaue Syntax wird an den entscheidenden Stellen erklärt.
Aus Text werden prüfbare Bedingungen
Eine Testbedingung beschreibt, welcher Teil einer Anforderung geprüft werden soll. Sie enthält noch nicht zwingend alle Eingabedaten. Für die Buchungsänderung lassen sich fünf Bedingungen ableiten:
- Eine Teamleitung kann 1 bis einschließlich 12 Plätze buchen.
- Eine andere beschäftigte Person kann 1 bis einschließlich 8 Plätze buchen.
- Werte unter 1 werden abgewiesen.
- Werte oberhalb der jeweiligen Rollenobergrenze werden abgewiesen.
- Unbekannte Rollen und nicht-ganzzahlige Platzangaben werden abgewiesen.
Das Wort einschließlich ist wichtig. Es klärt, dass 12 noch erlaubt und erst 13 abzuweisen ist. Ohne diese Präzisierung könnten Entwicklung, Test und Auftraggeber unterschiedliche Erwartungen haben.
Aus einer Testbedingung entsteht ein Testfall. Er verbindet eine konkrete Ausgangslage und Eingabe mit einem erwarteten Ergebnis. Ein nachvollziehbarer Testfall beantwortet mindestens diese Fragen:
| Bestandteil | Frage | Beispiel |
|---|---|---|
| Vorbedingung | Was muss vor dem Test gelten? | Die Buchungsfunktion ist verfügbar. |
| Eingabe | Welche Daten werden verwendet? | Rolle lead, Anzahl 12 |
| Aktion | Was wird ausgeführt? | Buchung prüfen |
| Soll-Ergebnis | Was muss beobachtbar passieren? | Rückgabewert true |
Das Soll-Ergebnis wird vor der Ausführung festgelegt. Wenn du es erst nach dem Test formulierst, besteht die Gefahr, dass du das beobachtete Verhalten nachträglich zur richtigen Lösung erklärst.
Schnellcheck
Lies die Anforderung wie eine testende Person
Entscheide dich bei jeder Frage. Du bekommst die Erklärung direkt nach deiner Antwort.
Geschafft
von 2
Situationen richtig eingeordnet.
Normal-, Rand- und Fehlerfälle decken unterschiedliche Risiken ab
Ein Normalfall verwendet eine gewöhnliche, gültige Eingabe. Er zeigt, ob der erwartete Hauptweg funktioniert. Für employee und 3 Plätze muss die Buchung angenommen werden.
Ein Randfall liegt an oder direkt neben einer fachlichen Grenze. Hier entstehen häufig Fehler durch einen falschen Vergleichsoperator. Für die Teamleitung sind 11, 12 und 13 aussagekräftiger als drei beliebige Werte aus der Mitte. Besonders 12 und 13 trennen die beiden möglichen Ergebnisse.
Ein Fehlerfall verwendet eine Eingabe, die das System abweisen oder kontrolliert behandeln soll. Dazu gehören 0 Plätze, 2.5 Plätze oder die unbekannte Rolle admin. Ein guter Fehlerfall prüft nicht nur, dass etwas fehlschlägt. Er legt fest, wie das System den Fehler sichtbar macht.
Diese Kategorien sind keine starren Schubladen. Ein Wert kann zugleich Rand- und Fehlerfall sein. Die 0 liegt direkt unter der unteren gültigen Grenze und muss abgewiesen werden. Entscheidend ist, welches Risiko der Testfall sichtbar macht.
Zuordnungsaufgabe
Ordne die Testfälle ihrem Hauptzweck zu
Ordne nach dem Risiko, das der Testfall in dieser Anforderung hauptsächlich sichtbar macht.
Richtig zugeordnet. Prüfe diese Zuordnung noch einmal.
Richtig zugeordnet. Prüfe diese Zuordnung noch einmal.
Richtig zugeordnet. Prüfe diese Zuordnung noch einmal.
Richtig zugeordnet. Prüfe diese Zuordnung noch einmal.
Richtig zugeordnet. Prüfe diese Zuordnung noch einmal.
von 5 richtig
Der Normalfall zeigt den gewöhnlichen Hauptweg. 12 und 13 liegen an beziehungsweise direkt neben der Rollenobergrenze. Kommazahl und unbekannte Rolle verletzen die festgelegten Eingaberegeln.
Eine kompakte Testfalltabelle
Eine Tabelle macht sichtbar, welche Bedingungen bereits abgedeckt sind. Sie ist außerdem verständlich, bevor ein Testframework feststeht.
| ID | Rolle | Plätze | Fallart | Soll-Ergebnis | Begründung |
|---|---|---|---|---|---|
| T01 | employee | 3 | Normalfall | angenommen | gültiger Wert in der Mitte |
| T02 | employee | 8 | Randfall | angenommen | obere Grenze eingeschlossen |
| T03 | employee | 9 | Randfall | abgewiesen | direkt oberhalb der Grenze |
| T04 | lead | 12 | Randfall | angenommen | neue Grenze eingeschlossen |
| T05 | lead | 13 | Randfall | abgewiesen | direkt oberhalb der neuen Grenze |
| T06 | lead | 0 | Rand- und Fehlerfall | abgewiesen | direkt unterhalb der Untergrenze |
| T07 | lead | 2.5 | Fehlerfall | abgewiesen | keine ganze Platzanzahl |
| T08 | admin | 2 | Fehlerfall | abgewiesen | unbekannte Rolle |
Die Tabelle ist bewusst überschaubar. Sie behauptet keine vollständige Absicherung der gesamten Buchungssoftware. Sie prüft die Regeln, die für diese Änderung relevant sind.
Arrange, Act und Assert machen Tests lesbar
Der folgende JavaScript-Code bildet die Anforderung ab. roleLimits ordnet jeder bekannten Rolle ihre Obergrenze zu. Die Funktion gibt true zurück, wenn Rolle und Anzahl gültig sind.
const roleLimits = {
employee: 8,
lead: 12,
}
export function canBook(role, seats) {
const limit = roleLimits[role]
if (limit === undefined || !Number.isInteger(seats)) {
return false
}
return seats >= 1 && seats <= limit
}
Ein automatisierter Test kann in drei gedankliche Schritte gegliedert werden:
- Arrange: Ausgangslage und Eingaben vorbereiten.
- Act: die zu prüfende Aktion ausführen.
- Assert: tatsächliches und erwartetes Ergebnis vergleichen.
Diese Struktur wird oft als AAA-Muster bezeichnet. Sie ist keine besondere JavaScript-Syntax. Sie hilft dabei, einen Test so zu schreiben, dass die Absicht schnell erkennbar bleibt.
import { canBook } from "./booking.js"
function assertEqual(actual, expected) {
if (actual !== expected) {
throw new Error(`Erwartet: ${expected}, erhalten: ${actual}`)
}
}
// Arrange
const role = "lead"
const seats = 12
// Act
const actual = canBook(role, seats)
// Assert
assertEqual(actual, true)
In einem echten Projekt übernimmt meist ein Testframework das Ausführen, Vergleichen und Berichten. Die drei Schritte bleiben trotzdem dieselben. Ein sprechender Testname sollte Bedingung und Erwartung erkennen lassen, zum Beispiel accepts twelve seats for lead.
Sortieraufgabe
Bringe den Test in eine nachvollziehbare Reihenfolge
Sortiere die Schritte für den Testfall: Eine normale beschäftigte Person darf 9 Plätze nicht buchen.
Ziehe die Einträge an die richtige Position. Geht auch per Tastatur über den Griff.
Die Reihenfolge stimmt.
Die Reihenfolge passt noch nicht.
Der Name gibt Orientierung. Danach folgen Vorbereitung, Ausführung und Vergleich. In vielen Frameworks steht der Testname außerhalb des AAA-Blocks, trägt aber zur Lesbarkeit des Testfalls bei.
Aussagekräftige Tests scheitern aus einem erkennbaren Grund
Ein Test ist besonders nützlich, wenn sein Fehlschlag auf ein überschaubares Verhalten zeigt. Ein einzelner Test sollte deshalb nicht gleichzeitig die Rolle anlegen, eine Buchung über die Oberfläche absenden, eine E-Mail abrufen und eine Datenbanktabelle kontrollieren, wenn eigentlich nur die Grenzprüfung untersucht werden soll.
Auch der Vergleich braucht ein konkretes Soll-Ergebnis. assert(result) sagt weniger als assertEqual(result, false). Bei komplexeren Ergebnissen gehören die relevanten Werte in den Vergleich oder in eine verständliche Fehlermeldung.
Betrachte diesen fehlerhaften Test:
const actual = canBook("lead", 13)
assertEqual(actual, true)
Die Ausführung ist korrekt, aber die Erwartung widerspricht der Anforderung. Ein Test ist nicht automatisch richtig, nur weil er automatisiert ist. Testcode muss ebenso geprüft und verständlich gehalten werden wie Produktivcode.
Fehlersuche
Finde die Ursache für den fehlschlagenden Test
Die Anforderung erlaubt Teamleitungen höchstens 12 Plätze. Der Test soll den Wert direkt oberhalb der Grenze prüfen. Welche Zeile ist falsch?
Fehler gefunden.
Diese Stelle ist nicht die Ursache.
13 liegt oberhalb der zulässigen Grenze. Der Test muss deshalb false erwarten. Rolle, Eingabe und Funktionsaufruf passen zur beabsichtigten Grenzprüfung.
Automatisiert und manuell erfüllen verschiedene Aufgaben
Automatisierte Tests sind besonders hilfreich, wenn eine Prüfung häufig und mit eindeutigem Soll-Ergebnis wiederholt werden soll. Die Buchungsgrenzen lassen sich schnell mit mehreren Datensätzen prüfen. Nach jeder Änderung kann derselbe Satz erneut laufen.
Manuelle Tests sind sinnvoll, wenn menschliche Wahrnehmung oder offene Erkundung wichtig ist. Ob eine Fehlermeldung in der Oberfläche verständlich wirkt, lässt sich nicht vollständig durch den Rückgabewert der Funktion beurteilen. Auch ein neuer, noch wenig verstandener Ablauf kann zunächst erkundend getestet werden.
Die Entscheidung ist daher nicht “automatisch oder manuell für alles”. Sie richtet sich nach dem Prüfziel:
| Prüfziel | Eher passend | Warum |
|---|---|---|
| bekannte Grenzwerte nach jeder Codeänderung prüfen | automatisiert | eindeutiges Ergebnis, häufig wiederholbar |
| Verständlichkeit einer neuen Fehlermeldung beurteilen | manuell | Wirkung braucht menschliche Einordnung |
| verschiedene Rollen und Zahlenkombinationen prüfen | automatisiert | viele gleichartige Datensätze |
| unerwartete Wege in einer neuen Oberfläche erkunden | manuell | Ablauf ist noch nicht vollständig vorhersehbar |
Automatisierung spart Wiederholungsarbeit, beseitigt aber keine unklaren Anforderungen. Ein schnell ausgeführter Test mit falschem Soll-Ergebnis bleibt ein falscher Test.
Regression bedeutet: Bekanntes Verhalten erneut prüfen
Ein Regressionstest prüft nach einer Änderung, ob bereits vorhandenes Verhalten weiterhin funktioniert. Die neue Grenze für Teamleitungen darf die Grenze für employee nicht versehentlich verändern. Deshalb bleiben T01 bis T03 relevant, obwohl die Änderung hauptsächlich lead betrifft.
Regressionstests sind kein eigener Testfalltyp neben Normal-, Rand- und Fehlerfall. Der Begriff beschreibt den Zweck der Wiederholung. Ein vorhandener Randfall kann beim ersten Durchlauf die aktuelle Funktion prüfen und nach der nächsten Änderung als Regressionstest dienen.
Schnellcheck
Entscheide nach dem Prüfziel
Entscheide dich bei jeder Frage. Du bekommst die Erklärung direkt nach deiner Antwort.
Geschafft
von 2
Situationen richtig eingeordnet.
Ein Befund muss für andere reproduzierbar sein
Ein fehlgeschlagener Test ist zunächst eine Beobachtung. Ein Befund macht daraus eine Information, mit der eine andere Person weiterarbeiten kann. Dafür braucht sie genug Kontext, um das Verhalten erneut auszulösen und Soll und Ist zu vergleichen.
Ein hilfreicher Befund enthält:
- eine kurze, konkrete Überschrift,
- betroffene Version oder Testumgebung,
- notwendige Vorbedingungen,
- nachvollziehbare Schritte und Eingaben,
- erwartetes Ergebnis,
- tatsächliches Ergebnis,
- bei Bedarf Protokolle oder Bildschirmaufnahmen ohne sensible Daten.
Wenig hilfreich wäre: “Buchung geht nicht.” Besser ist:
Teamleitung kann 12 Plätze nicht buchen Umgebung: Testsystem, Version 2.4.0 Schritte: Als Teamleitung anmelden, Schulung öffnen, 12 Plätze eintragen, Buchung bestätigen. Soll: Die Buchung wird angenommen. Ist: Die Oberfläche meldet “Maximal 8 Plätze” und lehnt die Buchung ab.
Diese Beschreibung enthält noch keine Behauptung über die technische Ursache. Die Ursache zu vermuten kann bei der Fehlersuche helfen, gehört aber getrennt von der beobachteten Wirkung dokumentiert.
Testen ist ein Teil der Qualitätssicherung
Testen vergleicht beobachtbares Verhalten mit einer Erwartung. Es kann Fehler sichtbar machen, beweist aber nicht, dass eine Anwendung unter allen Bedingungen fehlerfrei ist.
Qualitätssicherung ist weiter gefasst. Dazu gehören zum Beispiel klare Anforderungen, Reviews, Entwicklungsstandards, Versionsverwaltung, Tests, Auswertungen und Verbesserungen am Arbeitsprozess. Ein Code-Review kann einen Fehler finden, bevor das Programm ausgeführt wird. Ein Testprotokoll kann zeigen, welche Risiken geprüft wurden. Beides unterstützt Qualität, ist aber nicht dasselbe wie das Ausführen eines Testfalls.
Die Abgrenzung hilft bei der Planung. “Wir haben getestet” beantwortet noch nicht, ob Anforderungen verständlich waren, Änderungen nachvollziehbar versioniert wurden oder Befunde in den Prozess zurückfließen.
Transfer: Sichere eine Rabattänderung ab
Ein Bestellsystem berechnet einen Mengenrabatt. Bisher gab es ab 20 Stück 5 Prozent Rabatt. Künftig sollen registrierte Bildungseinrichtungen bereits ab 10 Stück 5 Prozent erhalten. Andere Kundengruppen behalten die Grenze von 20 Stück. Mengen müssen ganze Zahlen größer als 0 sein.
Transferaufgabe
Entwirf einen kleinen, tragfähigen Testsatz
Formuliere mindestens sechs Testfälle für die Änderung. Decke beide Kundengruppen, die Grenzen und mindestens einen Fehlerfall ab. Kennzeichne außerdem, welche vorhandenen Fälle als Regressionstests wichtig bleiben.
Musterlösung vergleichen
Musterlösung: Ein möglicher Testsatz enthält: Bildungseinrichtung mit 9 Stück, erwartet 0 Prozent; mit 10 Stück, erwartet 5 Prozent; mit 11 Stück, erwartet 5 Prozent. Andere Kundengruppe mit 19 Stück, erwartet 0 Prozent; mit 20 Stück, erwartet 5 Prozent; mit 21 Stück, erwartet 5 Prozent. Ergänzend prüft ein Fehlerfall die Menge 0, erwartet eine kontrollierte Ablehnung. Ein weiterer Fehlerfall kann 10.5 prüfen. Die Fälle für die andere Kundengruppe sind besonders wichtige Regressionstests, weil ihre bisherige Rabattgrenze durch die Änderung nicht beeinflusst werden darf.
Was du jetzt mitnehmen kannst
Du beginnst nicht mit zufälligen Testdaten, sondern mit einer eindeutigen Anforderung. Daraus leitest du Testbedingungen und konkrete Soll-Ergebnisse ab. Normalfälle zeigen den Hauptweg. Randfälle prüfen Grenzen. Fehlerfälle machen die kontrollierte Behandlung ungültiger Eingaben sichtbar.
Arrange, Act und Assert strukturieren einen automatisierten Test. Manuelle Tests ergänzen ihn dort, wo Wahrnehmung und Erkundung wichtig sind. Nach einer Änderung schützen Regressionstests bereits vorhandenes Verhalten. Wenn etwas nicht passt, macht ein reproduzierbarer Befund aus der Beobachtung eine bearbeitbare Aufgabe.
Die Grenze bleibt wichtig: Ein guter Testsatz senkt bekannte Risiken. Er beweist nicht, dass die gesamte Software fehlerfrei ist. Tests sind ein Werkzeug innerhalb einer umfassenderen Qualitätssicherung.
Belegmatrix
| Lernziel | Ordnungsmittel | Quellenbasis | Lernaktivität |
|---|---|---|---|
| Anforderung in Testbedingungen übersetzen | LF11a, B2 | KMK-Rahmenlehrplan; FIAusbV Abschnitt B Nummer 2 | Buchungsszenario, Anforderungsquiz |
| Normal-, Rand- und Fehlerfälle auswählen | LF11a, B2, AE-PB3 | Prüfungskatalog FIAE 2026; abstrahierte Muster zu Testdaten und Äquivalenzklassen | Zuordnung, Testfalltabelle |
| Tests mit Arrange, Act und Assert strukturieren | LF11a, B2 | Prüfungskatalog FIAE 2026: Qualitätssicherung und Tests | Codebeispiel, Sortieraufgabe, Fehlersuche |
| Automatisierung und Regression begründen | B2, AE-PB2 | FIAusbV; Prüfungskatalog; abstrahiertes Muster zu Regressionstests | Entscheidungstabelle, Quiz |
| Befunde reproduzierbar dokumentieren | B2 | FIAusbV: Testergebnisse aufbereiten; Prüfungskatalog: Testprotokoll und Auswertung | Beispielbefund, Transferaufgabe |
Durchgearbeitet?
Markiere die Lektion als erledigt, dein Fortschritt wird lokal gespeichert.