80 lines
3.1 KiB
Markdown
80 lines
3.1 KiB
Markdown
|
|
# 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/
|
|||
|
|
```
|