Zielgruppe: Java-Entwickler mit Grundkenntnissen in Maven — Vorwissen zum TestSupport-StateMachine-Tutorial hilft

Projekt auf GitHub     ← Zurück

1. Was ist TestSupport-Tool?

TestSupport-Tool ist ein Activiti-freier Re-Build des internen testsupport_client. Es automatisiert End-to-End-Tests gegen ein internes System, inkl. Prozess-Steuerung, GUI, Log-Analyse und XML-Diff-Vergleiche.

Statt einer Activiti-Engine mit BPMN-XML nutzt das Projekt die leichtgewichtige TestSupport-StateMachine-Library — damit entfällt ein großer Dependency-Stack (Spring, H2, Jersey, Apache HttpComponents, Groovy, ...).

Projekt-Status: Aktive Portierung. Das Kern-Framework (Engine, Handler, GUI, LogSearcher, XmlSearcher) läuft im Demo-Mode End-to-End. Echte REST-Integration wird schrittweise reaktiviert.

2. Wozu dieses Re-Build?

Das Original testsupport_client funktioniert produktiv einwandfrei — aber der Wartungsaufwand ist hoch:

Problem im OriginalLösung hier
Activiti-Engine + BPMN-Editor nötigProzess als Java-Code mit StateMachine-Library
Dependency-Graph ~40 LibrariesReduziert auf das Wesentliche
H2/PostgreSQL als Prozess-DBKein persistenter Zustand — nur ProcessContext im RAM
BPMN-XML-Diffs im Git schwer zu reviewenJava-Diffs sind Standard-Werkzeug
Debugging über Engine-StateNormaler Java-Debugger

Die Handler-Logik selbst wird nicht neu geschrieben, sondern aus dem Original 1:1 portiert — das garantiert Verhaltensäquivalenz.

3. Die TestSupport-Familie

Das Projekt lebt in einer Projekt-Landschaft mit vier verbundenen Repos:

ProjektRolle
testsupport_clientActiviti-Original. Quelle für Handler-Portierungen — Referenz-Verhalten
TestSupport-StateMachineEngine-Library (Activiti-Ersatz) — Dependency dieses Projekts
TestSupport-ToolDieses Projekt — Activiti-freier Re-Build
ITSQ-TestfaelleTest-Set-Lieferant (test_set/-Artefakt wird per maven-dependency-plugin nach X-TESTS/ITSQ entpackt)

4. Voraussetzungen & Setup

SoftwareVersionZweck
Java JDK21 oder höherCompile + Runtime
Maven3.6+Build-Tool
GitbeliebigQuellcode + Test-Daten-Referenz
TestSupport-StateMachine1.0.0-SNAPSHOTEngine-Library (muss lokal installiert sein)

Installation der StateMachine-Library

git clone https://github.com/CavdarKemal/TestSupport-StateMachine.git
cd TestSupport-StateMachine
ci.cmd 11         # installiert die JAR ins lokale Maven-Repo

Clone des Tools

git clone https://github.com/CavdarKemal/TestSupport-Tool.git
cd TestSupport-Tool

5. Build & Start

Build

# Ohne Tests (schnell)
ci.cmd 21

# Mit Tests (gründlich, WireMock + Jemmy)
cit.cmd 21

Headless im Demo-Mode starten

java -cp TestSupport-Core/target/testsupport-core-0.1.0-SNAPSHOT.jar:... \
     de.creditreform.crefoteam.cte.testsupporttool.auto.CteTestAutomatisierungMain \
     e:ENE -Demo:true

CLI-Argumente

ArgumentBedeutung
e:<env>Umgebung (z.B. ENE, GEE, ABE)
-Demo:trueDemo-Mode aktiviert (keine echten REST-Calls)
d:<bool>Alias für -Demo
Config-Files: Die Umgebungs-Parameter liegen in TestSupport-GUI/ENE-config.properties (bzw. GEE/ABE). Beim Start per e:ENE wird die passende Datei geladen.

6. Multi-Modul-Struktur

Das Projekt ist ein Maven-Multi-Modul-Projekt. Die Trennung folgt dem Prinzip „Backend/GUI getrennt“, damit Headless-Läufe (z.B. in CI) nicht die Swing-Dependencies ziehen:

ModulZweck
TestSupport-CoreHeadless-Engine, Handler, ProcessDefinition, CLI-Main
TestSupport-XmlSearcherXML-Suche + Ref-Export-Vergleich (Backend-Logik)
TestSupport-LogSearcherLog-Parsing + Suche (Backend-Logik)
TestSupport-GUI-BaseBasis-Swing-Komponenten (BaseView/BasePanel-Pattern, 1500+ Icons)
TestSupport-JvmDialogJVM-Dialog (Start-Parameter, Heap-Einstellungen)
TestSupport-XmlSearcher-GUISwing-GUI zum XmlSearcher-Backend
TestSupport-LogSearcher-GUISwing-GUI zum LogSearcher-Backend
TestSupport-GUIHaupt-GUI + Distribution-Assembly

7. Demo-Mode (CLAUDE_MODE)

Der gesamte Code ist im Demo-Mode lauffähig — echte REST-Aufrufe an das interne System werden simuliert. Das ermöglicht:

Wie funktioniert der Demo-Mode?

// In jedem Handler:
if (ctx.isDemoMode()) {
    // Dummy-Wert setzen + kurz schlafen (Animation)
    Thread.sleep(DEMO_MODE_WAIT_TIME.toMillis());
    ctx.put("ctImportJobId", "demo-job-42");
    return StepResult.NEXT;
}

// Echter Pfad (nur wenn nicht demo):
JobExecutionInfo job = restService.startCtImport(...);
ctx.put("ctImportJobId", job.getId());
CLAUDE_MODE-Blöcke: In der aktiven Portierung sind Server-Calls teilweise noch auskommentiert und mit CLAUDE_MODE-Kommentaren markiert. Diese Blöcke werden schrittweise reaktiviert, sobald der Demo-Pfad grün ist.

8. Die Handler

Jeder Handler entspricht einem userTask im ursprünglichen BPMN-Modell. Alle Handler erben von AbstractUserTaskRunnable, was die Preamble (Phase-Logging + Notify + DemoCheck) zentralisiert.

Handler-Muster

MusterBeispielTypisches Verhalten
Einfache AktionPrepareTestSystemSetzt Systemzustand, keine Rückmeldung abwarten
REST-Job-StartStartCtImportStartet einen Job per REST, merkt Job-ID im Context
PollingWaitForCtImportPollt wiederholt bis Job fertig oder Timeout
Wait-BeforeWaitBeforeCtImportThread-Sleep vor dem eigentlichen Start (Synchronisation)
Check/VerifyCheckRefExportsVergleicht Ist-Output gegen Referenz-XML
NotificationSuccessMail, FailureMailE-Mail-Versand am Prozess-Ende

Aktuelle Handler-Liste

Aus TestSupport-Core/.../handlers/: PrepareTestSystem, RestoreTestSystem, GeneratePseudoCrefos, StartCtImport, WaitForCtImport, WaitBeforeCtImport, StartBeteiligtenImport, WaitForBeteiligtenImport, WaitBeforBeteiligtenImport, StartBtlgAktualisierung, WaitForBtlgAktualisierung, StartEntgBerechnung, WaitForEntgBerechnung, StartExports, WaitBeforeExport, StartCollect, CheckCollects, CheckRefExports, CheckExportProtokoll, StartSftpUploads, CheckSftpUploads, StartRestore, StartUploads, SuccessMail, FailureMail.

9. Der Prozess-Ablauf

Der Haupt-Prozess liegt in process.TestAutomationProcess bzw. für den GUI-Einsatz in gui.CteAutomatedTestProcess. Er entspricht 1:1 dem CteAutomatedTestProcess.bpmn des Originals:

ProcessDefinition subPhase = ProcessDefinition.builder("TestAutomationProcessSUB")
    .step(new StartCtImportHandler(...))
    .step(new WaitForCtImportHandler(...))
    .step(new StartBeteiligtenImportHandler(...))
    .step(new WaitForBeteiligtenImportHandler(...))
    // ... weitere ~20 Steps
    .build();

ProcessDefinition main = ProcessDefinition.builder("TestAutomationProcess")
    .step(new PrepareTestSystemHandler(...))
    .step(new ConditionalStep("TestTypeGateway",
        ctx -> "PHASE1_AND_PHASE2".equals(ctx.get("TEST_TYPE")),
        new GeneratePseudoCrefosHandler(...),
        new SkipPseudoCrefosHandler(...)))
    .step(new SubProcessStep(subPhase))         // Phase 1
    .step(new SubProcessStep(subPhase))         // Phase 2
    .step(new SuccessMailHandler(...))
    .onFailure(new FailureMailHandler(...))
    .finallyStep(new RestoreTestSystemHandler(...))
    .build();

Resume-Fähigkeit

Ein Prozess kann per ResumeAwareSubProcessStep an einem beliebigen Schritt fortgesetzt werden (relevant, wenn Phase 1 sauber lief, Phase 2 aber geändert werden muss). Das Highlighting im Diagramm zeigt dabei, welche Steps übersprungen werden.

10. Die GUI

Die Haupt-GUI (Modul TestSupport-GUI) ist eine 1:1-Portierung der Original-Swing-GUI — inkl. aller ~1500 Icons. Aufbau:

BereichZweck
Customers-TabAuswahl der Test-Kunden (MultiSelect aus Test-Set)
Results-TabBaumansicht der Test-Ergebnisse, Drill-Down bis zum einzelnen Check
Prozess-Diagramm-TabLive-gerenderter Prozess-Verlauf (via ProcessDiagramRenderer)
Log-TabTimeline-Logger mit Step-Timestamps
Tools-MenüXmlSearcher, LogSearcher, JvmDialog
Start-/Abbruch-/Resume-ButtonsSteuerung der Engine-Ausführung

Design-View-Trennung

Alle GUI-Klassen folgen dem Pattern:

Haupt-Controller

Der ProcessController ersetzt den alten ActivitiProcessController. Er verbindet GUI-Events (Start/Abbruch) mit der ProcessEngine und verteilt ProcessListener-Events an die GUI-Tabs (Diagramm-Update, Log-Append, Result-Tree-Refresh).

11. LogSearcher & XmlSearcher

LogSearcher

Parst Log-Dateien aus dem Test-Ziel-System und findet Fehler-Muster. Eigenständig nutzbar, aber integriert auch über das Tools-Menü der Haupt-GUI.

XmlSearcher

Vergleicht erzeugte XML-Exports gegen Referenz-XMLs (Rueck-Regressions-Tests). Nutzt xmlunit für strukturierten Diff.

12. Env-Lock

Eine Test-Umgebung (ENE/GEE/ABE) darf nur von einer Tool-Instanz gleichzeitig genutzt werden — sonst würden parallele Läufe einander die Testdaten zerstören.

Der Env-Lock ist ein Server-Socket auf einer Port-Range (nicht Einzelport, um Windows-Loopback-Reservierungen zu umgehen):

13. Tests

Test-TypToolAbdeckung
Unit-TestsJUnit 5 + AssertJModelle, Utility-Klassen, Renderer
REST-IntegrationWireMock (Standalone)TesunRestService, REST-Job-Handler
GUI-TestsJemmySmoke-Tests für alle Panels, Resume-Dialog-Flow
XML-VergleichxmlunitCheckRefExports-Logik
End-to-EndJemmy + EngineVollständiger Start-Stop-Resume-Ablauf

Tests ausführen

# Alle Tests (dauert einige Minuten)
cit.cmd 21

# Nur ein Modul
cd TestSupport-Core
mvn test

# JaCoCo-Coverage-Report
mvn clean verify
# Report unter TestSupport-*/target/site/jacoco/index.html
Umgebungs-Abhängigkeit: Tests laufen immer gegen ENE — die Umgebung ist hart konfiguriert, damit Test-Ergebnisse reproduzierbar sind.

14. Nächste Schritte

Zum Ausprobieren

Zum Weiterentwickeln

Verwandte Projekte

Links