Finanzmanager/tests/e2e
fds2610-bot 932d17c128 Fix n.n.: „+ Neu“ öffnet das Formular zur Neuanlage als modalen Dialog
Elf Listenansichten (Klassen, Buchungsvorlagen, Regelmäßige Buchungen,
Erinnerungen, Verträge, Adressen, Sparziele, Kredite, Abgleichregeln,
Budgets, Berichtsgruppen) zeigten das Formular unter der Liste. Jetzt
öffnet der Knopf „+ Neu“ es als Dialog.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 09:50:08 +02:00
..
specs Fix n.n.: „+ Neu“ öffnet das Formular zur Neuanlage als modalen Dialog 2026-10-01 09:50:08 +02:00
package-lock.json Phase 0: Projektgerüst mit nginx, php-fpm und MariaDB 2026-08-09 20:21:42 +02:00
package.json Phase 0: Projektgerüst mit nginx, php-fpm und MariaDB 2026-08-09 20:21:42 +02:00
playwright.config.js Phase 0: Projektgerüst mit nginx, php-fpm und MariaDB 2026-08-09 20:21:42 +02:00
README.md Fix n.n.: E2E-Läufe sichern Einstellungen, Kippschalter statt Ankreuzfeldern 2026-09-29 11:37:52 +02:00
run.sh Fix n.n.: E2E-Läufe sichern Einstellungen, Kippschalter statt Ankreuzfeldern 2026-09-29 11:37:52 +02:00

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.

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:

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).