Unit Testing, Property-Based Testing, Model Checking und formale Verifikation: So weisen Sie Korrektheit und Qualitaet Ihrer Software in der Thesis nach – mit Testpyramide, Coverage-Metriken, TDD und CI-Integration.
Wenn Sie in der Thesis Software entwickeln, muessen Sie deren Korrektheit nachweisen – und „es funktioniert auf meinem Rechner" genuegt nicht. Gutachter bewerten: Gibt es automatisierte Tests? Wie hoch ist die Testabdeckung? Werden Grenzfaelle behandelt? Sind die Tests in der CI/CD-Pipeline integriert? Die Testpyramide (viele Unit Tests, wenige E2E Tests) ist der Standard. Fuer sicherheitskritische Systeme oder theoretische Arbeiten: formale Verifikation (Model Checking, Theorembeweiser). Unsere Ghostwriter der Informatik unterstuetzen bei Teststrategie und Implementierung.
Einzelne Funktionen/Methoden isoliert testen. Schnell, deterministisch, viele davon. Tools: JUnit 5 (Java), pytest (Python), Jest (JS/TS), Go testing. Mocks/Stubs fuer Abhaengigkeiten. Ziel: 80%+ Line Coverage als Richtwert.
Zusammenspiel mehrerer Komponenten testen: API + Datenbank, Service + Message Queue. Langsamer als Unit Tests. Tools: Testcontainers (Docker-basiert), Spring Boot Test, Supertest (Node.js).
Gesamtes System aus Nutzerperspektive. Langsam, fragil, teuer – wenige davon. Tools: Cypress, Playwright, Selenium. In der Thesis: 3–5 Hauptszenarien als E2E, Rest als Unit/Integration.
| Metrik | Beschreibung | Formel | Richtwert Thesis |
|---|---|---|---|
| Line Coverage | Anteil der ausgefuehrten Codezeilen | Ausgefuehrte Zeilen / Gesamt | ≥ 80% (BA), ≥ 85% (MA) |
| Branch Coverage | Anteil der durchlaufenen Verzweigungen (if/else) | Durchlaufene Branches / Gesamt | ≥ 70% |
| MC/DC | Modified Condition/Decision Coverage – jede Bedingung beeinflusst das Ergebnis unabhaengig | Streng: Jede Condition wird isoliert geaendert | Sicherheitskritisch (DO-178C Level A) |
| Mutation Score | Anteil der durch Tests erkannten kuenstlichen Fehler (Mutanten) | Getötete Mutanten / Gesamt | ≥ 70% (zeigt Testqualitaet, nicht nur -quantitaet) |
100% Line Coverage bedeutet nicht, dass der Code fehlerfrei ist – es bedeutet nur, dass jede Zeile ausgefuehrt wurde. Die Tests koennten trotzdem keine sinnvollen Assertions enthalten. Mutation Testing (PIT fuer Java, mutmut fuer Python) ist ein staerkerer Indikator: Kuenstliche Fehler (Mutanten) werden in den Code eingefuegt – wenn die Tests sie nicht finden, sind die Tests zu schwach. In der Thesis: Coverage berichten, aber nicht als alleiniges Qualitaetsmass.
Statt einzelne Testfaelle manuell zu schreiben, definieren Sie Eigenschaften (Properties), die fuer alle Eingaben gelten muessen. Das Framework generiert automatisch hunderte zufaellige Eingaben und sucht nach Gegenbeispielen.
Properties definieren: „Fuer alle Listen xs gilt: sort(xs) hat dieselbe Laenge wie xs." „Fuer alle Eingaben gilt: decode(encode(x)) == x." (Roundtrip-Property). PBT findet Grenzfaelle, die manuell geschriebene Tests uebersehen (leere Listen, Unicode, Integer-Overflow). In der Thesis: PBT als Ergaenzung zu Unit Tests – zeigt fortgeschrittene Testkompetenz.
| Ansatz | Idee | Tools | Thesis-Einsatz |
|---|---|---|---|
| Model Checking | Alle moeglichen Zustaende eines Systems systematisch durchsuchen und Eigenschaften pruefen (Temporal Logic: LTL, CTL) | SPIN (Promela), NuSMV, UPPAAL (Echtzeit), TLA+ (Lamport) | Protokolle, Concurrent Systems, CPS |
| Theorembeweiser | Mathematischer Beweis der Korrektheit mit Hilfe eines Proof Assistants | Coq, Isabelle/HOL, Lean 4, Agda | Algorithmus-Korrektheit, Kryptographie, Compiler-Verifikation |
| Abstract Interpretation | Ueberapproximation des Programmverhaltens – Fehler finden ohne alle Pfade zu durchlaufen | Astrée, Frama-C, Infer (Facebook) | Sicherheitskritische Software, C/C++ Analyse |
| Symbolic Execution | Programme mit symbolischen statt konkreten Werten ausfuehren – alle Pfade explorieren | KLEE, angr, Manticore | Security (Bug-Finding), Testgenerierung |
BA: Model Checking eines einfachen Protokolls (z.B. Mutual Exclusion) mit SPIN oder TLA+ ist machbar – UPPAAL fuer Echtzeitsysteme. MA: Formale Verifikation einer Kernkomponente (Algorithmus in Coq/Isabelle, Protokoll in SPIN, Concurrent System in TLA+). Diss: Umfassende formale Verifikation, ggf. mit mechanisiertem Beweis. In der Thesis: Formale Verifikation ergaenzt Testing – sie beweist Korrektheit fuer alle Eingaben (Testing zeigt nur Fehler fuer getestete Eingaben). Beides kombinieren ist die staerkste Strategie.
Teststrategie fuer Ihre Thesis?
Promovierte Informatiker unterstuetzen bei Testdesign, Property-Based Testing und formaler VerifikationRed → Green → Refactor: (1) Schreibe einen fehlschlagenden Test. (2) Schreibe den minimalen Code, der den Test bestehen laesst. (3) Refaktoriere. In der Thesis: Wenn Sie TDD verwenden, dokumentieren Sie es im Methodenteil – es zeigt methodische Strenge. Aber: TDD ist kein Evaluationsansatz – es ist eine Entwicklungsmethodik.
SonarQube: Code Smells, Bugs, Security Hotspots, Technical Debt. ESLint/Pylint: Sprachspezifische Linting-Regeln. Frama-C: Formale Analyse von C-Code. In der Thesis: SonarQube-Report als Anhang oder Abbildung – zeigt Code-Qualitaet objektiv. CI-Integration: Statische Analyse in der Pipeline bei jedem Commit.
Software wird entwickelt, aber es gibt null automatisierte Tests. Gutachter werten das zunehmend als gravierenden Mangel. Mindestens: Unit Tests fuer die Kernlogik.
Tests laufen gruen, pruefen aber nichts: nur dass der Code nicht abstuerzt (Smoke Tests). Jeder Test braucht sinnvolle Assertions, die das erwartete Ergebnis pruefen.
„95% Coverage" wird stolz berichtet, aber die Tests sind trivial. Coverage misst Ausfuehrung, nicht Qualitaet. Ergaenzen Sie: Mutation Score, Grenzfalltests, Fehlertests.
Nur E2E-Tests, keine Unit Tests – langsam, fragil, schwer zu debuggen. Die Testpyramide umdrehen ist ein Anti-Pattern. Basis: viele schnelle Unit Tests.
Richtwerte: BA: ≥ 70% Line Coverage fuer die Kernlogik. MA: ≥ 80% Line Coverage + ≥ 60% Branch Coverage. Aber: Coverage allein sagt wenig ueber Testqualitaet. Ergaenzen Sie Coverage durch Mutation Testing (Mutation Score ≥ 60%) und pruefen Sie Grenzfaelle explizit. Generated Code, Konfiguration und Boilerplate muessen nicht getestet werden – fokussieren Sie auf die Geschaeftslogik.
Nein – TDD ist eine Entwicklungsmethodik, keine Pflicht. Wenn Sie TDD verwenden: Dokumentieren Sie es im Methodenteil (es zeigt methodische Strenge). Wenn nicht: Schreiben Sie Tests nach der Implementierung (Test-Last) – das ist voellig akzeptabel. Entscheidend: Dass Tests existieren, nicht wann sie geschrieben wurden.
Verwenden Sie das Standardframework Ihrer Sprache: Java: JUnit 5 + Mockito. Python: pytest (nicht unittest – pytest ist moderner und maektiger). JavaScript/TypeScript: Jest oder Vitest. Go: testing (Standardbibliothek) + testify. C/C++: Google Test + Google Mock. Rust: Cargo test (eingebaut). In der Thesis: Framework und Version im Methodenteil dokumentieren. Mocking-Framework angeben (Mockito, unittest.mock, sinon).
Testing: Beck „Test-Driven Development: By Example" (2002) – der TDD-Klassiker. Aniche „Effective Software Testing" (2022) – modern, praxisnah. Property-Based Testing: MacIver „Hypothesis for the Working Programmer" (Dokumentation). Formale Verifikation: Baier/Katoen „Principles of Model Checking" (2008) – das Standardwerk. Nipkow/Wenzel/Paulson „Isabelle/HOL: A Proof Assistant for Higher-Order Logic". TLA+: Lamport „Specifying Systems" (kostenlos online). Statische Analyse: Emanuelsson/Nilsson „A Comparative Study of Industrial Static Analysis Tools" (fuer Ueberblick).
Ueber 200 promovierte Ghostwriter – darunter Informatiker mit Expertise in Software-Qualitaetssicherung, Testing und formaler Verifikation.
Informatik-Ghostwriter Jetzt anfragen