docs: update testing strategy and define directory symmetry

This commit is contained in:
2026-07-16 12:16:59 +02:00
parent 3629382dd0
commit 379d00542a
2 changed files with 49 additions and 10 deletions
+40 -2
View File
@@ -634,8 +634,46 @@ readonly class ShippingProvider implements ShippingProviderInterface
return $this->mapper->toModel($response);
} catch (TransportException $e) {
throw new ExternalSystemUnavailableException('Shipping API is down', 0, $e);
}
}
## 13. Testing Strategy & Structure
Die Testsuite ist so aufgebaut, dass sie die Schichtenmodell-Architektur widerspiegelt. Dies erleichtert die Wartung und stellt sicher, dass jede Komponente auf der richtigen Abstraktionsebene geprüft wird.
### Verzeichnisstruktur & Mapping
Die Struktur unter `tests/` folgt strikt der Symmetrie zu `src/`:
| Test Typ | Pfad in `tests/` | Spiegelt $\rightarrow$ | Werkzeug / Ansatz | Fokus |
| :--- | :--- | :--- | :--- | :--- |
| **Unit** | `tests/Unit/Logic/` | `src/Logic/` | PHPUnit + Mocks | Pure Business Logic & Edge Cases. |
| **Integration** | `tests/Integration/Data/` | `src/Data/` | Real DB (Test-Env) | Repositories, Mapper, Infrastruktur. |
| **Functional UI**| `tests/Functional/UI/` | `src/UI/` | Symfony `WebTestCase` | Einzelspezifische Endpunkte / Requests. |
| **Functional E2E**| `tests/Functional/Scenarios/`| (Szenario-basiert) | Symfony `WebTestCase` | Komplexe User Flows (Multi-Step). |
---
### Detaillierte Guidelines
#### 1. Unit Tests (`tests/Unit/Logic`)
Da die Logic Layer "Pure PHP" ist, müssen diese Tests extrem schnell sein.
- **Kein Framework**: Es wird kein Symfony Kernel gebootet.
- **Mocking**: Interfaces der Data Layer (`Provider`, `Processor`, `TransactionManager`) werden gemockt.
- **Business Models**: Werden *nicht* gemockt, sondern echt verwendet (da sie zustandslos/POPOs sind).
#### 2. Integration Tests (`tests/Integration/Data`)
Hier wird die Brücke zur Infrastruktur geprüft.
- **Datenbank**: Nutzung einer dedizierten Test-DB. Jeder Test sollte in einer Transaktion laufen, die am Ende gerolled wird (oder via Database-Reset).
- **Mapper-Tests**: Explizite Prüfung: `Entity` $\rightarrow$ `toModel()` $\rightarrow$ `Business Model`.
#### 3. Functional Tests (`tests/Functional`)
Diese nutzen den Symfony `WebTestCase`, um das System als "Black Box" zu testen.
- **UI Mirroring**: In `tests/Functional/UI` wird pro Controller ein entsprechender Test-Case angelegt, der die HTTP-Antworten (Status-Codes, JSON-Struktur) validiert.
- **Scenario-Tests**: In `tests/Functional/Scenarios` werden reale Business Flows abgebildet (z.B. `OrderProcessTest`), die mehrere API-Calls hintereinander ausführen und den finalen Zustand in der Datenbank prüfen.
#### 4. Mocking Guidelines
Um "fragile Tests" zu vermeiden, gilt:
- **Mock a Interface, not a Class**: Mocke immer das Interface (z.B. `OrderProviderInterface`), niemals die konkrete Implementierung (`OrderProvider`).
- **No Mocks for Models/DTOs**: Value Objects und Business Models werden immer echt instanziiert.
- **Avoid Mocking 3rd Party Libs**: Wenn externe Libs getestet werden müssen, schreibe einen eigenen Wrapper/Interface in die Logic Layer und mocke diesen.
}
```