Thema: Praktischer Teil 5. Mutationstests von Spezifikationen
Schwierigkeitsgrad: Mittel (Mittel)
Geschätzte Lernzeit: 3-4 Stunden
Voraussetzungen: Vertrautheit mit der Faktendisziplin aus Teil 9 des ersten Bandes (Format Given/When/Then)
Verständnis der SDD-Antipatterns aus Teil 20
Grundkenntnisse im Umgang mit der Linux-Kommandozeile und Python 3
Verständnis der JSON-Struktur und der Funktionsweise von JSON Schema
Lernziele: Den Generator für degenerierte Spezifikationen erfolgreich starten und die Determinismus-Eigenschaft der Generierung sicherstellen (Überprüfung über den Seed).
Die Robustheit des Validierungskreislaufs mithilfe der vektoriellen Immunitätsmetrik messen (strict_reject_rate, depth_of_diagnostics, recovery_time).
Jede generierte Mutation mit einem konkreten Given/When/Then-Szenarienschritt und einer JSON-Schema-Regel verknüpfen.
Eine korrekte und reproduzierbare, reviewbare Spur (Rauchtest-Bericht) für CI und SDD erzeugen.
Übersicht: Mutationstests von Spezifikationen (oder „Validator-Impfung") ist eine Praxis zur Überprüfung der Robustheit des Validators. Anstatt das System mit korrekten Daten zu prüfen, „verfälscht" die Technik gezielt die Basisspezifikation mithilfe vordefinierter Mutationsoperatoren (z. B. Entfernen von Feldern oder Erzeugen von Zyklen). Der Validator muss diesen Defekt in einem exakt definierten Schritt fangen und einen präzisen Fehlercode ausgeben. Dieser Ansatz verwandelt den Validator von einer reinen Syntaxprüfung in ein Werkzeug zur anatomischen Diagnose und stellt sicher, dass fehlerhafte Vorfälle nicht zu kaskadierenden Ausfällen in der Produktion führen.
Schlüsselkonzepte: Mutationstests (mutation testing): Testtechnik, bei der ein Referenzartefakt kontrolliert verändert (verfälscht) wird und der Testkreislauf diesen Defekt erkennen und ablehnen muss.
Immunitätsmetrik (immunity score): Vektorielle Metrik für die Robustheit des Validators, bestehend aus drei Komponenten: strict_reject_rate (Anteil streng abgelehnter Fälle), depth_of_diagnostics (nützliche Diagnosetiefe) und recovery_time (Zeit bis zur Rückkehr zu einem stabilen Urteil).
Mutationsfabrik (mutation factory): Deterministischer Generator, der eine korrekte Basisspezifikation (base_spec.json) übernimmt und einen Katalog von Verfälschungsoperatoren darauf anwendet, wobei die Reproduzierbarkeit über den Generierungs-Seed erhalten bleibt.
Mutationsoperatoren (mutation operators): Typen kontrollierter Defekte. Die wichtigsten Klassen: Nullify (Nullsetzen von Feldern), FutureTime (Zeitanomalien), EscalationCycle (Zyklen in Eskalationsrouten), PriorityContradiction (Prioritätswidersprüche).
Prinzip „eine Mutation – ein erwarteter Ausfall": Die wichtigste Regel der Mutationsfabrik. Ein Mutator darf nur einen einzigen Defekt einbauen, damit bei einem Testfehler die Ursache exakt lokalisiert und einer konkreten Regel zugeordnet werden kann.
Übungsaufgaben: Name: Starten der Mutationsgenerierung und Überprüfung des Determinismus
Problem: Sie müssen in das Beispielverzeichnis wechseln und das Mutationsgenerierungsskript mit den Operatoren Nullify, FutureTime, EscalationCycle, PriorityContradiction und dem festen Seed 20260517 ausführen. Es ist sicherzustellen, dass der Generator deterministisch ist.
Lösung: 1. Öffnen Sie ein Terminal und führen Sie aus: cd book2/examples/stress-mutator.
- Starten Sie den Generator: python3 scripts/mutate_specs.py --base base/base_spec.json --seed 20260517 --operators Nullify,FutureTime,EscalationCycle,PriorityContradiction --out out/mutations.
- Wiederholen Sie den Befehl aus Schritt 2.
- Vergleichen Sie die Manifestdateien: diff out/mutations/manifest.json manifest.example.json.
Erwartung: 0 Unterschiedszeilen, die Reihenfolge der mutation_id stimmt bei jedem Lauf überein.
Komplexität: beginner
Name: Berechnung des Immunitätsvektors des Validators
Problem: Verwenden Sie die zuvor generierten Mutationen, starten Sie den Fake-Validator und das Skript zur Berechnung der Immunitätsmetrik. Analysieren Sie die erhaltenen Werte und ziehen Sie eine Schlussfolgerung über die Einsatzbereitschaft des Kreislaufs.
Lösung: 1. Starten Sie den Validator: python3 scripts/fake_validator.py --mutations out/mutations --out out/validator_results.json.
- Starten Sie die Metrikberechnung: python3 scripts/immunity_score.py --validator-results out/validator_results.json --expected expected/expected_failures.json.
- Überprüfen Sie, dass die Werte den Schwellen entsprechen: strict_reject_rate >= 0.98, depth_of_diagnostics >= 3, recovery_time_p95_ms <= 1200.
Komplexität: intermediate
Name: Erzeugen einer reviewbaren Spur (Capstone)
Problem: Erstellen Sie auf Grundlage des durchgeführten Rauchtests (Praxisübungen 1 und 2) ein minimales Berichtsfragment für die Datei capstone/validation.md.
Lösung: Erstellen oder öffnen Sie capstone/validation.md und fügen Sie einen Block hinzu, der den Seed, die Liste der Operatoren, die berechneten drei Immunitätsmetriken und das abschließende Urteil (verdict: PASS/FAIL) enthält. Committen Sie nicht das Verzeichnis out/mutations selbst – die Quelle der Wahrheit muss der reproduzierbare Befehl sein.
Komplexität: intermediate
Fallstudien: Name: Validierung des Vorfalls appointment_latency_spike
Szenario: Betrachtet wird ein Produktionsvorfall mit einem starken Anstieg der Latenzen (appointment_latency_spike). Laut Spezifikation beträgt die SLA 10 Minuten, und die Eskalationsroute verläuft von appointments_oncall zu sre_lead. Die Basisspezifikation enthält korrekte Daten für diesen Fall.
Aufgabe: Es ist sicherzustellen, dass der Validator eine Situation nicht übersieht, in der das Feld severity leer wird. Wenn ein leeres Feld in das System durchsickert, kann es die SLA-Berechnung verfälschen und zu einer falschen Auswahl des Vorfalls-Eigentümers führen, was für die Kapazität der Bereitschaftsingenieure kritisch ist.
Lösung: Es wird der Mutationsoperator Nullify auf das Feld severity angewendet. Erwartet wird, dass der Validator den Defekt in der Phase Given:incident_received erkennt und den Code EMPTY_REQUIRED_FIELD ausgibt. Die Pipeline muss vor dem Schritt When:evaluate_sla_window zwangsweise angehalten werden. Das Ergebnis wird an die JSON-Schema-Regel gebunden: severity.minLength.
Ergebnis: Der Validator hat die Verarbeitung erfolgreich vor der SLA-Berechnung gestoppt. Im SDD ist die Beweiskette festgehalten: mutation_id, Spezifikationsunterschied (diff: 'P1' -> ''), Diagnosecode und Routing-Stack. Es wurde nachgewiesen, dass der Validator eine „anatomische Diagnose" gewährleistet.
Gewonnene Erkenntnisse: Zeitanomalien und leere Felder sollten vor Beginn der Weiterleitung und der SLA-Berechnungen geprüft werden.
Das Prinzip „eine Mutation – ein erwarteter Ausfall" ist entscheidend für die Lokalisierung von Problemen ohne manuelles Debugging.
Verwandte Konzepte: Operator Nullify
Format Given/When/Then
strict_reject_rate
Name: Erkennung eines Eskalationszyklus (cdn_error_budget_burn)
Szenario: Analysiert wird ein Vorfall mit einem Burn des Fehlerbudgets (cdn_error_budget_burn). Der Eigentümer edge_oncall übergibt einen P1-Vorfall an das Team traffic_sre.
Aufgabe: Mithilfe des Operators EscalationCycle wird eine Rückwärtskante (traffic_sre → edge_oncall) in den Eskalationsgraphen eingefügt. JSON Schema prüft die Datenform gut, kann aber nicht immer das topologische Verhalten der Route ausdrücken. Es ist zu prüfen, ob der Ausführungskreislauf in eine endlose Neueigentümerzuweisung gerät.
Lösung: Der Validator baut einen gerichteten Graphen der Eigentümer auf und startet eine Tiefensuche (DFS) mit den Zuständen white/gray/black. Wird ein grauer Knoten gefunden, wird der Fehler CYCLE_ESCALATION mit Angabe des minimalen Zyklus zurückgegeben. Der Ausfall wird an den Schritt When:route_escalation gebunden.
Ergebnis: Der Validator hat den Zyklus vor der Ausführungsphase erkannt und den Prozess gestoppt. Der Bericht zeigte eine klare Fehlerkette: schema.normalize -> step.when.prepare -> graph.build -> graph.detect_cycle -> halt.
Gewonnene Erkenntnisse: Die Diagnose topologischer Zyklen erfordert einen separaten Graphendurchlauf innerhalb des Validators.
Jede Mutation muss an eine konkrete Regel gebunden sein (z. B. $defs.escalation_graph.no_cycles), damit die Diagnose nicht zu allgemein ausfällt.
Verwandte Konzepte: Operator EscalationCycle
Graphendurchläufe (DFS)
depth_of_diagnostics
Lerntipps: Überprüfen Sie stets den Determinismus: Führen Sie den Mutationsgenerator zweimal mit demselben Seed aus und vergleichen Sie die Dateien. Ein einzelner Lauf ohne Überprüfung ist zufälliges Rauschen und keine verlässliche Metrik.
Achten Sie auf die Klassen degenerierter Szenarien (Leere Felder, Zeitanomalien, Eskalationszyklen, Rekursive Abhängigkeiten). Entwickler vergessen häufig Rückwärtskanten in Graphen.
Betrachten Sie die Immunitätsmetrik bei ihrer Untersuchung immer als Vektor. Wenn strict_reject_rate steigt und depth_of_diagnostics sinkt, ist Ihr Kreislauf strenger, aber „blinder" geworden (der Ingenieur versteht nicht, wie er den Vorfall beheben soll).
Merken Sie sich die Regel: Das Verzeichnis out/ wird nicht in Git commitet. Speichern Sie im Repository nur den Seed, die Operatoren und die zusammenfassenden Metriken.
Zusätzliche Ressourcen: Runnable example: book2/examples/stress-mutator/README.md — lauffähige Python-Skripte zum lokalen Start der Mutationsfabrik und zur Immunitätsberechnung.
Part 09 feature validation: ../book/part-09-feature-validation.md — die Faktendisziplin der Validierung, ohne die Spezifikationsmutationen ihren Sinn verlieren.
Part 20 sdd antipatterns: ../book/part-20-sdd-antipatterns.md — der Katalog klassischer Prozessfehler, auf dem die Mutationsoperatoren aufbauen.
Zusammenfassung: Mutationstests von Spezifikationen verwandeln die Validierungsprüfung in einen beherrschbaren Engineering-Kreislauf. Mithilfe der Mutationsfabrik erzeugen Sie gezielt degenerierte Szenarien (leere Felder, Zyklen, Zeitfehler) und prüfen, ob der Validator sie im korrekten Given/When/Then-Schritt fängt. Die Berechnung der vektoriellen Immunitätsmetrik (strict_reject_rate, depth_of_diagnostics, recovery_time) ermöglicht es, ein CI-Gateway einzurichten, das keine Regression durchlässt und das System vor toxischen Anforderungen und kaskadierenden Ausfällen schützt.