Files
2026-07-24 21:37:03 +02:00

126 lines
5.6 KiB
Markdown

# Testbericht
Stand: 24. Juli 2026
## Ergebnisübersicht
| Prüfung | Ergebnis | Nachweis |
|---|---|---|
| Vollständiger Quellen- und Fixture-Audit | bestanden | `docs/SOURCE_ANALYSIS.md`, `build-logs/source-audit.json` |
| Vergleich aktueller Plugins gegen v2.0-Bundle | bestanden | nur erzeugte `__pycache__`-Dateien unterscheiden sich; `build-logs/source-diff.log` |
| Vorhandene Backend-Plugin-Tests | **11 bestanden, 8 übersprungen** | `build-logs/backend-plugin-tests.log` |
| Statische Android-Akzeptanzprüfung | **728 bestanden** | `build-logs/static-acceptance.log` |
| Ressourcenprüfung | 8 JSON- und 7 XML-Dateien parsebar | `build-logs/resource-validation.log` |
| Kotlin-Parserprüfung ohne Android-Classpath | keine Syntax-/Parserdiagnosen | `build-logs/kotlinc-syntax-summary.txt` |
| `./gradlew test` | **nicht ausführbar in dieser Umgebung** | Wrapper-Download scheitert an nicht auflösbarem `services.gradle.org`; `build-logs/gradle-test.log` |
| `./gradlew lintDebug` | **nicht ausführbar in dieser Umgebung** | gleicher Infrastrukturfehler; `build-logs/gradle-lintDebug.log` |
| `./gradlew assembleDebug` | **nicht ausführbar in dieser Umgebung** | gleicher Infrastrukturfehler; `build-logs/gradle-assembleDebug.log` |
| Debug-APK | **nicht erzeugt** | ohne Gradle-Distribution, Android SDK und aufgelöste Abhängigkeiten wäre ein APK nicht verifizierbar |
## Ausgeführte Backendtests
Ausgeführt im vollständigen boehmitools-Quellstand:
```bash
python3 -m pytest -q \
plugins/trainingsplan/tests \
plugins/trainingstracker/tests
```
Ergebnis:
```text
11 passed, 8 skipped in 0.05s
```
Die übersprungenen Tests stammen aus den gelieferten Testsets und wurden nicht von der Android-Implementierung ausgeblendet.
## Android-Tests im Projekt
### Unit- und Fixture-Tests
`FixtureContractTest` prüft unter anderem:
- beide gelieferten Pläne mit `schema_version = 3` und `contract_version = 2`,
- vollständige und entitätsspezifisch eindeutige stabile IDs,
- explizite `result_schema`-Definitionen aller Übungen und Progressionsstufen,
- Laden beider Planvarianten,
- Migration beider alten Sessiondateien ohne Itemverlust,
- Priorität manuelle Anpassung → Progressionsstufe → Übung → Fallback,
- Vererbung nicht überschriebener result_schema-Felder,
- sichere Löschung inkompatibler Messwerte bei Einheit-/Seitenwechsel,
- Normalisierung alter Freitextergebnisse zu `result_data` Version 2,
- FIFO-Overlay ausstehender Session-Patches nach App-Neustart,
- Überschreibmodell für genau eine Wochen- beziehungsweise Gesamtanalyse.
`ApiContractTest` verwendet MockWebServer und prüft:
- exakten Session-Patch-Pfad, `PATCH`, Basic-Auth-Header und `expected_revision`,
- `202 Accepted` sowie `200` am selben Analyse-Endpunkt,
- unveränderte Weitergabe von `401` und `409 revision_conflict`,
- dokumentierte Editor-, Publish- und Vorschlagsstatus-Pfade.
### Repository- und Instrumentationstests
`RepositoryIntegrationTest` prüft mit Room, WorkManager und MockWebServer:
- Netzantwort und Room-Cache,
- sichtbare `409`-Weitergabe ohne Umwandlung in einen scheinbaren Offline-Erfolg,
- Erhalt des HTTP-Status `202` für die dauerhafte Analyse-Sperre.
`CompactEditorUiTest` setzt eine 360-dp-breite Compose-Oberfläche auf und prüft, dass lange Übungsnamen und strukturierte Ergebnisse innerhalb der verfügbaren Breite bleiben.
Diese Android-Tests sind vollständig im Projekt vorhanden, konnten in diesem Container aber nicht gestartet werden, weil bereits der Gradle-Wrapper-Download vor der Projektauswertung fehlschlägt.
## Statische Akzeptanzprüfung
Ausgeführt:
```bash
python3 tools/static_acceptance.py
```
Ergebnis:
```text
PASS: 728 Prüfungen
```
Die Prüfung deckt Buildparameter, Release-Netzwerksicherheit, Standardserver, verbotene WebView/OpenAI-Verbindungen, Basic Auth, zentrale API-Routen sowie alle gelieferten Plan- und Session-Fixtures ab.
## Kotlin-Parserprüfung
Alle Kotlin-Dateien wurden zusätzlich mit dem vorhandenen standalone `kotlinc` eingelesen. Da Android SDK und Maven-/Gradle-Abhängigkeiten fehlen, entstehen erwartungsgemäß nicht auflösbare Android-, Compose-, Hilt-, Retrofit- und Serialization-Symbole. Die separat gefilterte Prüfung meldet jedoch keine Parserfehler wie ungeschlossene Blöcke, illegale Escapes oder unerwartete Tokens.
Dies ersetzt keinen echten Gradle-Compile-Lauf. Das vollständige Rohprotokoll ist deshalb nur Diagnosematerial und kein Bestehensnachweis.
## Blocker der geforderten Gradle-Läufe
Alle drei vorgeschriebenen Befehle wurden separat ausgeführt und protokolliert. Die Laufumgebung enthält:
- keine installierte Gradle-Distribution,
- kein Android SDK, kein `sdkmanager`, kein `adb`,
- keinen vorgefüllten Gradle- oder Maven-Cache,
- keine DNS-Auflösung für `services.gradle.org` aus Shell-Prozessen.
Der mitgelieferte Wrapper versucht korrekt Gradle 8.11.1 zu laden und beendet sich mit `UnknownHostException`. Der Fehler tritt vor der Auswertung von `settings.gradle.kts` und damit vor Kompilierung, Tests, Lint oder APK-Erzeugung auf. Details stehen in `build-logs/build-environment.log` und den drei Gradle-Protokollen.
## Lokal nachzuholende Abnahme
In einer normalen Android-Entwicklungsumgebung mit JDK 17, Android SDK 35 und Internetzugang:
```bash
./gradlew test
./gradlew lintDebug
./gradlew assembleDebug
```
Anschließend ist zusätzlich empfehlenswert:
```bash
./gradlew connectedDebugAndroidTest
adb install -r app/build/outputs/apk/debug/app-debug.apk
```
Die erwartete APK-Ausgabe ist `app/build/outputs/apk/debug/app-debug.apk`. Bis diese Befehle erfolgreich gelaufen sind, darf das Projekt nicht als vollständig buildverifiziert bezeichnet werden.