Finanzmanager/tests/e2e/README.md
fds2610-bot 5695e2e3df Fix n.n.: E2E-Läufe sichern Einstellungen, Kippschalter statt Ankreuzfeldern
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-29 11:37:52 +02:00

128 lines
4.5 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.

# E2E-Tests
Browser-Tests mit Playwright, ausgeführt über das Projekt
[`e2e-runner`](../../../e2e-runner). Auf dem Host wird nichts installiert – der
Runner startet je Lauf einen frischen Container und räumt ihn danach weg.
## Voraussetzungen
Die Anwendung muss **vor** dem Testlauf laufen und vom Host erreichbar sein:
```bash
docker compose up -d
```
Einmalig den Testnutzer anlegen:
```bash
docker compose exec -u www-data php php scripts/e2e-benutzer.php
```
## Ausführen
```bash
tests/e2e/run.sh
```
Fehlt Docker, der Runner oder das Playwright-Image, wird mit Exit-Code 0
übersprungen statt fehlzuschlagen.
Abweichende Werte:
```bash
BASE_URL=http://host.docker.internal:8000 tests/e2e/run.sh
E2E_USER=e2e E2E_PASSWORD=geheim tests/e2e/run.sh
E2E_RUNNER_DIR=/pfad/zum/runner tests/e2e/run.sh
```
## Lockfile
`package.json` pinnt `@playwright/test` auf die Version des Runner-Images
(aktuell 1.61.1). Das Lockfile wird ohne lokale Node-Installation erzeugt:
```bash
docker run --rm -u "$(id -u):$(id -g)" -e HOME=/tmp -v "$PWD/tests/e2e":/work -w /work \
mcr.microsoft.com/playwright:v1.61.1-noble npm install --package-lock-only
```
## Welche Ebene wofür
Hierher gehört nur, was einen Browser braucht: Formularabläufe, Redirects,
gerenderte Views, JavaScript. Rechen- und Model-Logik gehört in die PHP-Suite
(`tests/NN_*.php`) – schneller und isoliert.
## Einstellungen
`run.sh` sichert die Tabelle `einstellungen` vor dem Lauf und stellt sie danach wieder
her (`scripts/e2e-einstellungen.php`). Specs dürfen Einstellungen also frei ändern, müssen
sie aber nicht selbst zurücksetzen.
## Aufräumen
Jeder Lauf legt Konten, Kategorien, Klassen und Buchungen neu an – mit einer
Zeitmarke im Namen, damit zwei Läufe sich nicht ins Gehege kommen. Damit sich
das nicht ansammelt, räumt `run.sh` **vor** jedem Lauf auf:
```bash
docker compose exec -u www-data php php scripts/e2e-aufraeumen.php
docker compose exec -u www-data php php scripts/e2e-aufraeumen.php --probe # nur zählen
```
Vor dem Lauf und nicht danach, weil ein abgebrochener Lauf sonst einen Bestand
hinterlässt, an den niemand mehr denkt – und weil die Daten des letzten Laufs
so bis zum nächsten für die Fehlersuche stehen bleiben.
Gelöscht wird alles, was am Testnutzer hängt, nicht, was nach Testdaten
aussieht: Ein Namensmuster übersähe die Buchung „Supermarkt“ und träfe
irgendwann etwas Echtes. Der Nutzer selbst bleibt stehen, und er muss den
Anzeigenamen tragen, den `scripts/e2e-benutzer.php` setzt – sonst bricht das
Skript ab, statt einem echten Zugang den Bestand zu leeren.
`E2E_KEIN_AUFRAEUMEN=1` lässt den Bestand stehen:
```bash
E2E_KEIN_AUFRAEUMEN=1 tests/e2e/run.sh
```
## Grundbestand
Nach dem Aufräumen legt `run.sh` einen festgelegten Grundbestand an:
```bash
docker compose exec -u www-data php php scripts/e2e-grundbestand.php
```
Ein Teil der Tests prüft die Darstellung, nicht das Rechnen – dass ein Bericht
eine Tabelle statt eines Platzhalters zeigt, dass Zahlenspalten rechtsbündig
stehen, dass „Übrige Konten“ eine Ebene tiefer führt. Solche Tests brauchen
einen Bestand, legen ihn aber nicht selbst an; bis zum Aufräumen lebten sie von
den Resten früherer Läufe und fanden je nach Vorgeschichte etwas anderes vor.
Die Zuschnitte in `E2EGrundbestand` sind deshalb nicht beliebig: mehr Konten als
`Vermoegensentwicklung::SERIEN` (sonst fehlt „Übrige Konten“), Buchungen in jedem
Monat des laufenden Jahres (sonst bleiben Monatsspalten leer), ein Vorjahr für
den Vergleichsbericht, ein Depot mit Wertpapiergeschäft für die Wertpapierlisten.
Wer daran etwas ändert, sieht in `tests/41_E2EAufraeumenTest.php` nach: Dort steht
zu jeder Grenze, welcher Test daran hängt.
Wer eine Spec schreibt, die eigene Daten braucht, legt sie weiterhin selbst an –
der Grundbestand trägt nur die Tests, die irgendeinen Bestand voraussetzen.
## Gemeinsame Helfer
`specs/hilfen.js` liegt neben den Specs, endet aber nicht auf `.spec.js` und wird
deshalb nicht als Testdatei eingesammelt. Dort steht `komboboxWaehlen()`: Die
Typeahead-Felder aus `public/static/kombobox.js` lassen ihr `<select>` versteckt
im Formular stehen, `selectOption()` läuft darauf in einen Timeout. Der Helfer
tippt stattdessen die Beschriftung ein und klickt den genau passenden Treffer an.
```js
const { komboboxWaehlen } = require('./hilfen')
await komboboxWaehlen(zeile.locator('#zuordnungsauswahl select'), 'Lebensmittel')
```
## Berichte
HTML-Report, Screenshots und Traces landen nach einem Lauf in
`playwright-report/` und `test-results/` (beide nicht im Repository).