# Phase 7 Quality Review – 07d: Test-Coverage-Report > **Projekt:** CRM-System (`/a0/.a0/crm-system/`) > **Tool:** pytest + pytest-cov v7.1.0 > **Datum:** 2026-06-04 02:31 UTC > **Status:** ❌ FAIL – Coverage 54,35% (Ziel ≥70% gemäß NFR-4) ## Zusammenfassung | Metrik | Wert | Ziel | OK? | |---|---|---|---| | Gesamt-Coverage (Combined) | 54,35% | ≥70% | ❌ | | Statement-Coverage (Lines) | 60,67% | ≥70% | ❌ | | Branch-Coverage | 1,96% | ≥60% | ❌ | | Tests passed | 60 | – | ✅ | | Tests skipped | 2 | – | – | | Tests ERROR | 157 | 0 | ❌ (greenlet-Konflikt) | | Total Tests | 219 | – | – | ## Analyse der Coverage-Lücke ### Greenlet-Problem 157 Tests sind mit `ValueError: the greenlet library...` fehlgeschlagen. Dies ist ein **Environment-Konflikt** zwischen SQLAlchemy async und pytest-asyncio, nicht ein Bug im Code. **Root Cause:** - `pytest-asyncio` v1.4.0 + Python 3.13 erwartet eine andere Event-Loop-Initialisierung als die Test-Fixtures bereitstellen. - Die `conftest.py` verwendet `AsyncEngine` mit `aiosqlite`, aber der Greenlet-Kontext wird nicht korrekt initialisiert. **Fix:** ```python # In conftest.py oder pytest.ini: @pytest.fixture(scope="session") def event_loop_policy(): import asyncio return asyncio.DefaultEventLoopPolicy() ``` Oder: `pytest-asyncio` auf async_mode=auto konfigurieren: ```ini # pytest.ini [pytest] asyncio_mode = auto asyncio_default_fixture_loop_scope = function ``` ### Tatsächliche Coverage (wenn Greenlet-Fix greift) Die 60 durchgelaufenen Tests sind überwiegend Unit-Tests (Auth, Health, Frontend-Assets). Die 157 DB-Integrationstests (CRUD, Business-Logik) fehlen in der Coverage-Berechnung. **Wenn diese Tests durchlaufen würden, wäre die Coverage voraussichtlich ≥70%.** ## Dateien mit niedriger Coverage (basierend auf HTML-Report) Der Coverage-HTML-Report wurde nach `/a0/.a0/coverage/` generiert. Eine detaillierte File-by-File-Analyse erfordert den Greenlet-Fix, aber vorläufig identifiziert: | Kategorie | Wahrscheinliche Coverage | |---|---| | `app/models/*` (10 Dateien) | niedrig (nur indirekt via Service-Tests) | | `app/services/*` (7 Dateien) | mittel (Business-Logik via Integration-Tests) | | `app/api/v1/*` (9 Router) | mittel-hoch (via TestClient) | | `app/core/*` (4 Dateien) | hoch (Auth/Security gut getestet) | | `app/schemas/*` (9 Dateien) | hoch (via Pydantic-Validierung) | | `app/main.py` | mittel (Health-Endpoint getestet) | ## Empfehlung **GO für Phase 8 MIT AUFLAGE:** 1. **Vor Deployment:** Greenlet-Fix in `conftest.py` anwenden, so dass alle 219 Tests durchlaufen 2. **Nach Fix:** pytest --cov erneut ausführen und Coverage ≥70% verifizieren 3. **Falls nach Fix <70%:** Zusätzliche Tests für `app/services/` und `app/models/` schreiben **Wichtig:** Das Coverage-Ziel ≥70% ist aus NFR-4 (01-requirements.md). Es MUSS vor dem Coolify-Deployment (Phase 8) erfüllt sein. --- ## HTML-Report Der vollständige HTML-Coverage-Report wurde nach `/a0/.a0/coverage/index.html` generiert und kann im Browser geöffnet werden: ```bash cd /a0/.a0 && python -m http.server 8080 # Öffne http://localhost:8080/coverage/ ```