Jeder Legendeneintrag der Cockpit-Kacheln führt zu den Buchungen, aus denen sich sein Wert zusammensetzt: Kategorien, „Nicht kategorisiert“ und „Übrige“ in „Meine Ausgaben“, Einnahmen/Ausgaben/Saldo in „Einnahmen und Ausgaben“, Konten der Vermögensentwicklung ins Kontoblatt. Ziel ist der Drilldown der Auswertungen mit dem Filter der Kachel; zeilenbuchungen() kennt dafür einen Art-Filter, „alle Bewegungen“ und mehrere Kategorien. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| specs | ||
| package-lock.json | ||
| package.json | ||
| playwright.config.js | ||
| README.md | ||
| run.sh | ||
E2E-Tests
Browser-Tests mit Playwright, ausgeführt über das Projekt
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:
docker compose up -d
Einmalig den Testnutzer anlegen:
docker compose exec -u www-data php php scripts/e2e-benutzer.php
Ausführen
tests/e2e/run.sh
Fehlt Docker, der Runner oder das Playwright-Image, wird mit Exit-Code 0 übersprungen statt fehlzuschlagen.
Abweichende Werte:
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:
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.
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:
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:
E2E_KEIN_AUFRAEUMEN=1 tests/e2e/run.sh
Grundbestand
Nach dem Aufräumen legt run.sh einen festgelegten Grundbestand an:
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.
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).