E2E Functional Acceptance Tests für aktive Bundesländer (Umbrella) #50

Closed
opened 2026-04-09 09:02:10 +02:00 by tobias · 1 comment
Owner

Zweck

Umbrella-Tracking für End-to-End Functional Acceptance Tests der aktiven Bundesland-Adapter und der Wahlprogramm-Indexierung — abgegrenzt von der bestehenden 77-Test-Unit-Suite.

Was hier gebaut wird ist kein TDD (Test-Driven Development = Test zuerst, Code danach). Standardklassifikation:

  • End-to-End / Acceptance Tests — testen die ganze Pipeline (Adapter → API → Wahlprogramm-Index → LLM-Output) statt einzelne Funktionen
  • Cross-Validation gegen externe Ground Truth — die Frontend-Seite des jeweiligen Landtags ist die unabhängige Wahrheitsquelle
  • Property-based Testing für Zitat-Verifikation — die Eigenschaft "jedes zitierte Snippet ist Substring der angegebenen PDF-Seite" wird als Invariante geprüft, ohne sich auf die LLM-Quellenangabe zu verlassen
  • Regression Tests für die bekannten Bug-Klassen aus den letzten Sessions

Architektur

Separates Verzeichnis tests/integration/ mit eigenem conftest.py (ohne die fitz/bs4/openai-Stubs der Unit-Suite). Marker integration in pytest.ini. Default-pytest läuft die schnelle Unit-Suite wie heute, pytest -m integration läuft die E2E-Suite.

webapp/tests/
├── conftest.py                 # bisher (Unit-Stubs)
└── integration/
    ├── __init__.py
    ├── conftest.py             # ohne Stubs, echte Imports
    ├── ground_truth.py         # kuratierte Drucksachen pro BL
    ├── test_adapters_live.py            # Sub-Issue A
    ├── test_frontend_xref.py            # Sub-Issue B
    ├── test_wahlprogramme_indexed.py    # Sub-Issue C
    └── test_citations_substring.py      # Sub-Issue D

Sub-Issues

  • Sub-Issue A — Live Adapter Tests (Reachability + Type-Filter + Datum + Fraktionen + PDF-Link)
  • Sub-Issue B — Adapter ↔ Frontend Cross-Validation gegen kuratierte Ground-Truth-Drucksachen
  • Sub-Issue C — Wahlprogramm Indexing-Status + PDF-Inhalts-Plausibilität (fängt anachronistische PDF-Tausches wie #10)
  • Sub-Issue D — Citation Property-Verification (jedes LLM-Zitat als Substring der angegebenen PDF-Seite)

Bug-Klassen aus den letzten Sessions, die durch die Suite abgedeckt werden

Alle nicht bereits in der Unit-Suite gefangen:

# Bug-Klasse Sub-Issue
2 WEV01 vs WEV06 Hit-Format-Drift (LSA VOLL-Mode) A
6 TH kind=Vorlage + type="Antrag gemäß § 79 GO" A
7 Anderer Card-Layout (HE) — <h3> ohne <span> A (kein-Result → Test fail)
8 NI Login-Page → 0 Treffer A (xfail mit Reason)
9 abgeordnetenwatch tauscht PDF unter altem Slug (CDU BE 2023→2026) C
10 LLM halluziniert Quelle ("FDP NRW 2022" für MV-Antrag) D
11 Wahlprogramm fehlt komplett im Index (heute morgen, 6 BL) C
13 Datum leer trotz BE-Format mit vom A
14 get_document() liefert Match aus falschem Bundesland B
15 embeddings-DB Chunks aus altem Programm-Slug C
16 Pagination liefert keine Antrag-Drucksachen (Type-Filter-Drift) A
17 Cross-Bundesland-Zitat D (PROGRAMME-Match prüft auch bundesland)
18 PDF-Download-Link kaputt A (optional slow)

Bereits in der Unit-Suite abgedeckt: 1 (doctype/doctype_full), 3 (format_quotes_for_prompt), 4 (F.D.P.-Regex), 5 (Ministerium-Regex), 12 (Landesregierung).

Aufruf-Konvention

pytest                                  # nur die schnellen Unit Tests (< 1s, Default)
pytest -m integration                   # nur die langsamen E2E Tests
pytest -m "integration and not slow"    # E2E ohne PDF-Download-Probes
pytest -m "" tests/                     # alles inkl. integration

Akzeptanzkriterien (Umbrella schließt sich wenn alle Sub-Issues durch)

  • Sub-Issue A — Live Adapter Tests
  • Sub-Issue B — Frontend Cross-Validation
  • Sub-Issue C — Wahlprogramme Indexed + Content
  • Sub-Issue D — Citation Property-Verification

Plan-Datei

Vollständiger Implementierungsplan inkl. Helper-Funktionen, Sample-Schema und kritischen Files: ~/.claude/plans/keen-pondering-puddle.md

## Zweck Umbrella-Tracking für **End-to-End Functional Acceptance Tests** der aktiven Bundesland-Adapter und der Wahlprogramm-Indexierung — abgegrenzt von der bestehenden 77-Test-Unit-Suite. Was hier gebaut wird ist **kein TDD** (Test-Driven Development = Test zuerst, Code danach). Standardklassifikation: - **End-to-End / Acceptance Tests** — testen die ganze Pipeline (Adapter → API → Wahlprogramm-Index → LLM-Output) statt einzelne Funktionen - **Cross-Validation gegen externe Ground Truth** — die Frontend-Seite des jeweiligen Landtags ist die unabhängige Wahrheitsquelle - **Property-based Testing für Zitat-Verifikation** — die Eigenschaft "jedes zitierte Snippet ist Substring der angegebenen PDF-Seite" wird als Invariante geprüft, ohne sich auf die LLM-Quellenangabe zu verlassen - **Regression Tests** für die bekannten Bug-Klassen aus den letzten Sessions ## Architektur Separates Verzeichnis `tests/integration/` mit eigenem `conftest.py` (ohne die `fitz`/`bs4`/`openai`-Stubs der Unit-Suite). Marker `integration` in `pytest.ini`. Default-`pytest` läuft die schnelle Unit-Suite wie heute, `pytest -m integration` läuft die E2E-Suite. ``` webapp/tests/ ├── conftest.py # bisher (Unit-Stubs) └── integration/ ├── __init__.py ├── conftest.py # ohne Stubs, echte Imports ├── ground_truth.py # kuratierte Drucksachen pro BL ├── test_adapters_live.py # Sub-Issue A ├── test_frontend_xref.py # Sub-Issue B ├── test_wahlprogramme_indexed.py # Sub-Issue C └── test_citations_substring.py # Sub-Issue D ``` ## Sub-Issues - **Sub-Issue A** — Live Adapter Tests (Reachability + Type-Filter + Datum + Fraktionen + PDF-Link) - **Sub-Issue B** — Adapter ↔ Frontend Cross-Validation gegen kuratierte Ground-Truth-Drucksachen - **Sub-Issue C** — Wahlprogramm Indexing-Status + PDF-Inhalts-Plausibilität (fängt anachronistische PDF-Tausches wie #10) - **Sub-Issue D** — Citation Property-Verification (jedes LLM-Zitat als Substring der angegebenen PDF-Seite) ## Bug-Klassen aus den letzten Sessions, die durch die Suite abgedeckt werden Alle nicht bereits in der Unit-Suite gefangen: | # | Bug-Klasse | Sub-Issue | |---|---|---| | 2 | WEV01 vs WEV06 Hit-Format-Drift (LSA VOLL-Mode) | A | | 6 | TH `kind=Vorlage` + `type="Antrag gemäß § 79 GO"` | A | | 7 | Anderer Card-Layout (HE) — `<h3>` ohne `<span>` | A (kein-Result → Test fail) | | 8 | NI Login-Page → 0 Treffer | A (xfail mit Reason) | | 9 | abgeordnetenwatch tauscht PDF unter altem Slug (CDU BE 2023→2026) | C | | 10 | LLM halluziniert Quelle ("FDP NRW 2022" für MV-Antrag) | D | | 11 | Wahlprogramm fehlt komplett im Index (heute morgen, 6 BL) | C | | 13 | Datum leer trotz BE-Format mit `vom` | A | | 14 | get_document() liefert Match aus falschem Bundesland | B | | 15 | embeddings-DB Chunks aus altem Programm-Slug | C | | 16 | Pagination liefert keine Antrag-Drucksachen (Type-Filter-Drift) | A | | 17 | Cross-Bundesland-Zitat | D (PROGRAMME-Match prüft auch `bundesland`) | | 18 | PDF-Download-Link kaputt | A (optional `slow`) | Bereits in der Unit-Suite abgedeckt: 1 (`doctype/doctype_full`), 3 (`format_quotes_for_prompt`), 4 (F.D.P.-Regex), 5 (Ministerium-Regex), 12 (Landesregierung). ## Aufruf-Konvention ```bash pytest # nur die schnellen Unit Tests (< 1s, Default) pytest -m integration # nur die langsamen E2E Tests pytest -m "integration and not slow" # E2E ohne PDF-Download-Probes pytest -m "" tests/ # alles inkl. integration ``` ## Akzeptanzkriterien (Umbrella schließt sich wenn alle Sub-Issues durch) - [ ] Sub-Issue A — Live Adapter Tests - [ ] Sub-Issue B — Frontend Cross-Validation - [ ] Sub-Issue C — Wahlprogramme Indexed + Content - [ ] Sub-Issue D — Citation Property-Verification ## Plan-Datei Vollständiger Implementierungsplan inkl. Helper-Funktionen, Sample-Schema und kritischen Files: `~/.claude/plans/keen-pondering-puddle.md`
Author
Owner

E2E-Umbrella komplett implementiert. Alle 4 Sub-Issues fertig (#51 Adapter-Live, #52 Frontend-Xref, #53 Wahlprogramm-Indexing, #54 Citation-Substring), Commits 73a7f76 + 64cbff5 + nachfolgende. 206 Integration-Tests collected, optional via 'pytest -m integration'.

E2E-Umbrella komplett implementiert. Alle 4 Sub-Issues fertig (#51 Adapter-Live, #52 Frontend-Xref, #53 Wahlprogramm-Indexing, #54 Citation-Substring), Commits 73a7f76 + 64cbff5 + nachfolgende. 206 Integration-Tests collected, optional via 'pytest -m integration'.
Sign in to join this conversation.
No description provided.