LogoRRR verwendet TestFX, um Integrationstests gegen seine JavaFX-Benutzeroberfläche auszuführen. Diese Tests gewährleisten, dass zentrale Arbeitsabläufe neue Features, Refaktorierungen und Abhängigkeitsaktualisierungen überstehen — und sie fangen Regressionen ab, die Unit-Tests schlicht nicht erkennen können.
Warum jetzt
Nach mehr als 20 Releases war LogoRRR komplex genug geworden, dass manuelles Testen allein nicht mehr ausreichte. Die Codebasis brauchte ein Sicherheitsnetz. TestFX ermöglicht es, das eigentliche Anwendungsfenster zu steuern — Schaltflächen anklicken, Dateien öffnen, UI-Zustand prüfen — direkt aus JUnit-Testmethoden heraus.
Die Entscheidung, wann in End-to-End-Tests zu investieren ist, ist immer ein Abwägungsprozess. Am Anfang eines Projekts ändern sich UIs zu schnell, als dass Tests mithalten könnten. Sobald sich jedoch die zentralen Abläufe stabilisieren, werden Tests zum Beschleuniger statt zur Last. Dieser Wendepunkt kam mit Version 24.3.0.
Umsetzung
Scalas knappe Syntax eignet sich gut dafür, eine kleine Test-DSL aufzubauen. Jede atomare Aktion — eine Datei öffnen, den Schließen-Button anklicken, prüfen ob das Tab-Panel leer ist — wird zu einem lesbaren Baustein:
@Test def openAndCloseTab(): Unit = {
checkForEmptyTabPane()
openFile(path)
checkForNonEmptyTabPane()
clickOn(lookup(UiNodes.LogFileHeaderTabs).query[StackPane](), MouseButton.SECONDARY)
waitAndClickVisibleItem(CloseTabMenuItem.uiNode(fileId))
checkForEmptyTabPane()
}
Das Schreiben von Frontend-Tests erzwang auch Verbesserungen am Produktionscode. Eine neue Service-Schicht wurde eingeführt, um Datei-I/O und externe Prozessaufrufe zu abstrahieren — Änderungen, die die Architektur unabhängig von etwaigen Testvorteilen verbesserten.
Was die Tests aufgedeckt haben
- Verhalten beim Beenden der Anwendung — Ressourcen, die nie ordnungsgemäß freigegeben wurden, wurden unter Tests sofort offensichtlich
- Testisolierung — Jeder Test muss seinen eigenen Zustand aufbauen und wieder abbauen, was mehrere subtile Annahmen über gemeinsam genutzten UI-Zustand aufdeckte
- Performance-Baseline — Die Ausführungszeit der Tests im Blick zu behalten verhindert ein langsames Ansammeln träger Tests
Foto von Sora Shimazaki on Pexels.
