Back openDesk Edu for a sovereign, open-source education â every vote counts.
Vote nowSave products you love by clicking the heart icon.
LLMs can generate Terraform codeâbut only 3 out of 7 models produce security-compliant IaC. A recent study benchmarks models for secure infrastructure generation and reveals how to use AI safely.
DreiĂig Jahre lang war das Testen die Steuer, die man fĂŒrs Ausliefern bezahlte. Man schrieb die Funktion und danach â falls die Frist es zulieĂ, falls das Coverage-Gate den Release nicht um 23 Uhr blockierte â die Tests. Der Forschungskorpus erzĂ€hlt heute eine andere Geschichte. Von 4.358 Software-Engineering-Papieren, die im vergangenen Jahr aufgenommen wurden, ist "automated testing" ein stetiger Keyword-Burst, und eine neue Zelle ist aus dem Nichts entstanden: agentisches Testen. Der Engpass ist nicht verschwunden. Er hat den Besitzer gewechselt.
Das dominierende Muster von 2025â2026 ist nicht lĂ€nger "ein Mensch schreibt den Test". Es lautet "ein LLM schreibt den Test, ein Mensch prĂŒft ihn". Die Arbeit bĂŒndelt sich in drei Bewegungen.
Unit-Test-Generierung aus echtem Code. Benchmarks wie ULT (UnLeakedTestbench) existieren genau deshalb, weil die meisten frĂŒheren Benchmarks kontaminiert waren und aus strukturell trivialen Funktionen bestanden, sodass ihre Erfolgszahlen nicht verallgemeinert werden konnten. ULT ist aus echten Python-Funktionen aus der Praxis gebaut, um diesen Bias zu entfernen.
Test-Carving aus Produktions-Traffic. NL2Test, ein Experience-Paper aus Enterprise-Microservice-Teams, verwandelt eine natĂŒrlichsprachliche Szenariobeschreibung plus eine aufgezeichnete Traffic-Aufnahme in abspielbare API-Regressionstests â es bindet dynamische Werte aus den Antworten, statt sie hart zu kodieren, und erzeugt Assertions, die der GeschĂ€ftslogik folgen statt fragiler Feldgleichheit.
Assertion-Generierung. Das Schwierige war nie der Request; es war das Oracle â was "korrekt" eigentlich bedeutet. NL2Test erzeugt Assertions, die an der geschĂ€ftlichen Bedeutung ausgerichtet sind, nicht am bytegenauen Response.
Nichts davon entfernt den Menschen. Es verschiebt ihn nach vorn: vom Verfassen von Boilerplate zum Beurteilen der Intention.
Search-basierte Werkzeuge lieferten hohe Coverage und unlesbare Tests. LLM-Werkzeuge lieferten das Gegenteil â menschenlesbare Tests, die oft nicht kompilierten oder wenig abdeckten. AdverTest formuliert das direkt: Es lĂ€sst einen Test-Generierungs-Agenten gegen einen Mutanten-Generierungs-Agenten antreten, der den Code umschreibt, um genau die Fehler einzubauen, die die Tests eigentlich finden sollen. Wenn die Tests auf dem Mutanten weiterhin bestehen, haben sie nie etwas getestet.
Zwei empirische Befunde sollten die Begeisterung kĂŒhlen.
Eine generierte Testsuite ist eine Hypothese, kein Zertifikat.
Die sauberste Idee im Korpus ist ConVerTest: zuverlĂ€ssige Tests synthetisieren, ohne die korrekte Implementierung zur Hand zu haben, an der man prĂŒfen könnte. Es kombiniert Self-Consistency (mehrheitsbasierte konvergente Tests), Chain-of-Verification (argumentationsgeleitete Verfeinerung) und Dual-Execution-Agreement (Code und Tests im Konsens gegenseitig validieren). Auf BIGCODEBENCH und LBPP hebt es TestgĂŒltigkeit, Zeilenabdeckung und Mutations-Score um bis zu 39%, 28% und 18% ĂŒber die Baselines. Die praktische Lesart: Man kann eine Suite allein aus einer Spezifikation wachsen lassen und sie dann durch Konsens hĂ€rten.
# Ein von einem LLM generierter Test â und warum der Mutations-Score, nicht die Coverage, das echte Signal ist
def parse_version(s: str) -> tuple[int, int, int]:
major, minor, patch = s.split(".")
return int(major), int(minor), int(patch)
def test_parse_version():
assert parse_version("1.2.3") == (1, 2, 3)
assert parse_version("10.0.1") == (10, 0, 1)
assert parse_version("0.0.0") == (0, 0, 0) # tötet den `>` -> `>=`-Mutanten
Ein Coverage-Tool meldet 100% fĂŒr diese Funktion. Ein Mutation-Tool injiziert irgendwo > â >= und fragt: FĂ€llt damit ein Test durch? Wenn nicht, ist deine "100% Coverage" eine Geschichte, die dir das Modell erzĂ€hlt hat.
| Signal | Was es aussagt | Grenze |
|---|---|---|
| Line-Coverage | Der Code wurde ausgefĂŒhrt | Sagt nichts ĂŒber Assertions aus |
| Branch-Coverage | Die Pfade wurden genommen | Immer noch kein Oracle-Check |
| Mutations-Score | Tests töten injizierte Fehler | Das QualitÀtssignal, das zÀhlt |
Die DORA- und SonarQube-Daten stimmen zu: oberhalb von etwa 80% Coverage ist notwendig, aber nicht hinreichend fĂŒr geringere Defektdichte in hyperskalierbaren Systemen.
Das Testen von KI-Systemen holt ein Problem zurĂŒck, das das klassische Testen fĂŒr gelöst hielt: das Oracle. Wenn das System unter Test ein LLM oder ein Agent ist, ist "korrekte Ausgabe" unscharf. Der Korpus antwortet in zwei Richtungen.
Und das Meta-Muster: The Rise of Agentic Testing beschreibt Multi-Agenten-Systeme, in denen ein Generator, ein Kritiker und ein Runner darĂŒber streiten, ob ein Test taugt. FeedbackLLM macht das Gleiche mit spezialisierten Feedback-Agenten pro Belang. SAINT hebt es auf die Service-Ebene und erzeugt Endpoint- und Szenario-Tests fĂŒr Enterprise-Java aus statischer Analyse plus LLM-Agenten.
Zwei Papers benennen die Gefahr prÀzise. (Over)Reliance on Test Agents in AI-Assisted Software Testing zeigt, dass Teams KI-generierten Tests mehr vertrauen, als sie sollten. On the risk of coding before testing ist eine empirische Studie, die genau das Anti-Pattern findet, vor dem ihr Titel warnt: Code und Tests gemeinsam zu erzeugen liefert selbstbewusste, falsche Suites.
Der Fehlermodus ist subtil. Ein KI schreibt eine Funktion und einen Test, die miteinander ĂŒbereinstimmen. Sie sind konsistent, nicht korrekt. Der Test besteht; der Bug wird ausgeliefert. TestLoop, ein Prozessmodell, setzt den Menschen bewusst wieder in die Schleife: Die Maschine schlĂ€gt vor, der Mensch verfĂŒgt.
Die zweite HĂ€lfte des Titels ist die neuere Disziplin. Du testest nicht nur mit KI; du testest die KI.
Auch die sichere Code-Generierung hat ihr eigenes Red Team: adversarielle Prompts, die LLM-Defenses auf die Probe stellen. Die Lektion wiederholt sich â Evaluation muss adversariell sein, nicht zeremoniell.
Wenn du eine Sache mitnimmst: Der Test ist jetzt ein Artefakt erster Klasse, das du wie Code reviewst. Konkret.
# Quality-Gate: Build fehlschlagen lassen, wenn der Mutations-Score fÀllt
- name: Mutations-Score
run: |
mutmut run --paths-to-mutate=src/
score=$(mutmut results | compute_score)
test "$score" -ge 80 # Schwache Tests sichtbar machen, nicht verstecken
Testen ist nicht einfacher geworden. Es ist eine Stufe nach oben gewandert. Du testest nicht mehr nur den Code; du testest die Tests, und du testest den Tester. Die Teams, die gewinnen, sind nicht die mit den meisten KI-generierten Tests. Es sind die, die sie reviewen.