Files
crm-system/docs/quality/07d-coverage-report.md
T

80 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/
```