zmsautomation-Dokumentation
ZMS Automation – ATAF-Integration
Dieses Modul enthält API- und UI-Tests für ZMS auf Basis von ATAF (Test Automation Framework) und Cucumber. zmsautomation baut auf it-at-m/agile-test-automation-framework auf.
Voraussetzungen
- Java 21
- Maven 3.9+
- MySQL-/MariaDB-Datenbank (für lokale Tests)
- Zugriff auf Maven Central (ATAF-Artefakte werden unter
de.muenchen.ataf:core|rest|webveröffentlicht)
Projektstruktur
src/test/java/zms/api/– ursprüngliche REST-assured + JUnit-Tests (Standalone-Profil)src/test/java/zms/ataf/zms/ataf/rest/steps/– REST-Step-Definitionen (REST Assured)zms/ataf/ui/steps/– UI-Step-Definitionen (Selenium/ATAF web)zms/ataf/ui/pages/**– Page-Objects für Admin, Statistik, Buergeransicht, Mailinator
src/test/resources/features/– Cucumber-Feature-Dateienrest/zmsapi/– Features der ZMS-REST-APIrest/zmscitizenapi/– Features der Citizen-REST-APIui/zmsadmin/– Admin-UI-Featuresui/buergeransicht/– veraltete Buergeransicht-UI-Features ausit-at-m/eappointment-buergeransicht(nicht fürzmscitizenviewverwendet)ui/zmsstatistic/– Statistik-UI-Featuresui/zmscitizenview/– CitizenView-UI (Service Finder + vollständige Buchung E2E)
src/main/resources/db/migration/– Flyway-Datenbankmigrationen
Tests ausführen
Mit dem Test-Skript (empfohlen)
Das Skript zmsautomation-test kümmert sich um Datenbank-Setup, Migrationen und Testausführung.
# alle [ATAF](https://it-at-m.github.io/agile-test-automation-framework/)-Tests ausführen (API + UI)
./zmsautomation/zmsautomation-test -Pataf-api -Pataf-ui
# Tests mit bestimmten Tags ausführen (mit @ignore markierte Szenarien sind ausgeschlossen, sofern @ignore nicht im Ausdruck enthalten ist)
./zmsautomation/zmsautomation-test -Dcucumber.filter.tags="@smoke"
# inklusive ignorierter Szenarien, z. B.:
# ./zmsautomation/zmsautomation-test -Dcucumber.filter.tags="@ignore and @web"
# spezifisches API-Feature ausführen (Pfad relativ zum zmsautomation-Modul)
./zmsautomation/zmsautomation-test -Pataf-api -Dcucumber.features="src/test/resources/features/rest/zmsapi/status.feature"
# nur API-Tests (kein Selenium)
./zmsautomation/zmsautomation-test -Pataf-api
# nur UI-Tests (Selenium/[ATAF](https://it-at-m.github.io/agile-test-automation-framework/) web)
./zmsautomation/zmsautomation-test -Pataf-uiDas Skript:
- Sichert die Datenbank
- Leert Caches
- Setzt die Datenbank zurück (Tabellen verwerfen)
- Importiert die Basis-Datenbank (
.resources/zms.sql) - Führt Flyway-Migrationen aus (Maven-Plugin)
- Führt PHP-Migrationen aus (
zmsapimigrate) - Führt den Stunden-Cron aus (mit Wiederholungen)
- Führt den Minuten-Cron und die Slot-Berechnung aus (
calculateSlots) - Führt HTTP-Health-Checks aus (zmsapi, Citizen-API, CitizenView, optionales refarch-gateway)
- Richtet Display-/Browser-Tooling ein (Xvfb, Treiberprüfungen)
- Führt
mvn testmit deinen Argumenten aus (Standard-Tag-Filter ergänztnot @ignore, sofern du@ignorenicht selbst einbeziehst) - Druckt Test-Reports
- Leert Caches erneut
- Stellt Datenbank- und Keycloak-JSON-Backups wieder her (sofern nicht
SKIP_DB_RESTORE=1) - Bereinigt abschließend (Datenverzeichnis, Flyway-Test-Zeilen usw.; auch auf
EXITregistriert)
Standalone-Profil (klassische REST-assured-Tests)
Führt die ursprünglichen JUnit-basierten REST-assured-Tests aus:
cd zmsautomation
mvn test -PstandaloneATAF als Standard
Das Maven-Profil ataf ist in diesem Modul standardmäßig aktiv, daher binden mvn test und mvn test-compile bereits die ATAF-/Cucumber-/TestNG-/Selenium-Abhängigkeiten ein.
ATAF-Profile (lokale Entwicklung)
- Alle ATAF-Tests ausführen (API + UI):
cd zmsautomation
mvn test- Nur API-Tests (REST Assured, kein Selenium):
mvn test -Pataf-api
# optionaler Filter:
# mvn test -Pataf-api -Dcucumber.filter.tags="@rest"
# mvn test -Pataf-api -Dcucumber.filter.tags="@zmsapi"
# mvn test -Pataf-api -Dcucumber.filter.tags="@zmscitizenapi"- Nur UI-Tests (Selenium/ATAF web, kein REST Assured):
mvn test -Pataf-ui
# optionaler Filter:
# mvn test -Pataf-ui -Dcucumber.filter.tags="@web"
# mvn test -Pataf-ui -Dcucumber.filter.tags="@zmsadmin"
# mvn test -Pataf-ui -Dcucumber.filter.tags="@buergeransicht"
# mvn test -Pataf-ui -Dcucumber.filter.tags="@zmsstatistic"
# mvn test -Pataf-ui -Dcucumber.filter.tags="@zmscitizenview"macOS-Host (CLI)
Vom Repo-Root:
./cli tests install-mac-depsFür Safari zusätzlich aktivieren: Safari → Entwickeln → Automatisierung erlauben.
./cli tests run-mac-local --db-full-setup
./cli tests run-mac-local
./cli tests trust-local-gatewayVerwende --browser safari (oder chrome, firefox, edge, safari) nach Bedarf.
Umgebungsvariablen
API-Endpunkte
BASE_URI– Basis der ZMS-APICITIZEN_API_BASE_URI– Basis der Citizen-API (REST-Steps rufen zms-web direkt auf)ADMIN_BASE_URI/STATISTIC_BASE_URI– Basen von Admin/StatistikCITIZEN_VIEW_BASE_URI/CITIZENVIEW_PORT– CitizenView/Vite-Server (Standard8082)REFARCH_GATEWAY_OFFICES_URL– optionale URL für den Gateway-Health-PingSKIP_REFARCH_GATEWAY_HEALTH=1– Gateway-Ping überspringen
Datenbankkonfiguration
MYSQL_HOST(Standarddb)MYSQL_PORT(Standardtcp://db:3306)MYSQL_DATABASE(Standarddb)MYSQL_USER(Standarddb)MYSQL_PASSWORD(Standarddb)MYSQL_ROOT_PASSWORD(Standardroot)
UI-Tests (SSO)
Für lokale UI-Tests (Statistik, Admin) ist der Standard-SSO-Benutzer der Keycloak-Account ataf (Passwort vorschau) aus den Keycloak-Migrationsdaten.
Beispiel
export BASE_URI="http://web/terminvereinbarung/api/2"
export CITIZEN_API_BASE_URI="http://web/terminvereinbarung/api/citizen"
export MYSQL_HOST="db"
export MYSQL_PORT="tcp://db:3306"
export MYSQL_DATABASE="db"
export MYSQL_USER="db"
export MYSQL_PASSWORD="db"
cd zmsautomation && mvn testDatenbankeinrichtung
ATAF-Tests führen vor der Testausführung automatisch Flyway-Migrationen aus. Die Migrationen liegen unter src/main/resources/db/migration/.
Beispiele für Test-Tags
- API-Tags:
@rest@zmsapi@zmscitizenapi
- UI-Tags:
@web@zmsadmin@buergeransicht(veraltet; nicht fürzmscitizenviewverwendet)@zmsstatistic@zmscitizenview@jumpin@ruppertstrasse@passkalender@hauptkalender@abholung@executeLocally@allowDisabledServicesMix
- Sonstige:
@smoke
@executeLocally ist ein reiner UI-Tag (@web-Szenarien), nicht für reine REST-Szenarien.
Feature-Dateien
API-Features (src/test/resources/features/rest/)
rest/zmsapi/status.feature– Tests des Status-Endpointsrest/zmscitizenapi/zmskvr-1124_booking_ruppertstrasse_pass_calendar_jumpin_links_citizenapi.feature– Buchungs-Flow der Citizen-API
UI-Features (src/test/resources/features/ui/)
ui/zmsadmin/– Admin-UI-Featuresui/buergeransicht/– veraltete Buergeransicht-Features ausit-at-m/eappointment-buergeransicht(nicht fürzmscitizenviewverwendet)ui/zmscitizenview/– Buchungs-UI-Features von CitizenViewui/zmsstatistic/– Statistik-UI-Features
zmsautomation in GitHub-Workflows
GitHub-Actions-Workflow: .github/workflows/zmsautomation-workflow.yaml.
Dokumentation folgt.
zmsautomation in Safari unter macOS außerhalb des Containers
Safari-basierte Automatisierung kann unter macOS bereits außerhalb des Containers ausgeführt werden. Aktuell ist das für Safari erforderlich, da es keinen Safari-WebDriver-Runtime für Linux-ARM/-AMD-Container gibt.
In cli_test.py steht ein CLI-Setup-/-Run-Flow zur Verfügung:
# lokale macOS-Testabhängigkeiten installieren (inkl.: sudo safaridriver --enable)
./cli tests install-mac-deps
# lokale Tests auf macOS mit Safari ausführen
./cli tests run-mac-local --browser safariIn Safari musst du außerdem aktivieren:
Safari → Entwickeln → Automatisierung erlauben
Migrationshinweise
zmsautomationnutzt ATAF + Cucumber; CI-/Workflow-Umgebungen können separat festgepinnt werden.
Bekannte Einschränkungen
Buchungstests an gesetzlichen Feiertagen
Die Slot-Berechnung erzeugt an gesetzlichen Feiertagen absichtlich keine Termine (Datensätze in der Tabelle feiertage, befüllt durch Migration V11). Die Testdaten für Öffnungszeiten in zmsautomation (relativ zum aktuellen Datum, z. B. in den Migrationen V10 und V19) können in einen Feiertag fallen. In diesem Fall gibt es am „ersten verfügbaren Tag“ ggf. keine buchbaren Slots und buchungsbezogene Szenarien (Citizen API und CitizenView Flows) können fehlschlagen.
Das ist erwartetes Verhalten. Maßnahme: Pipeline am nächsten arbeitsfreien Nicht‑Feiertag erneut ausführen (oder lokal an einem Nicht‑Feiertag starten).