JavaFX 自動化測試

JavaFX 自動化測試

使用 TestFX 測試 LogoRRR

LogoRRR 使用 TestFX 對其 JavaFX 使用者介面運行整合測試。這些測試確保核心工作流程在新功能迭代、程式碼重構和依賴更新後仍能正常運行——並且能捕獲單元測試根本無法發現的回歸問題。

為何現在引入

經過 20 多個版本的迭代,LogoRRR 的複雜度已經高到僅靠手動測試難以為繼的程度。程式碼庫需要一張安全網。TestFX 使得直接驅動真實應用程式視窗成為可能——在 JUnit 測試方法中點擊按鈕、打開文件、檢查 UI 狀態。

何時投入端到端測試,始終是一個權衡的問題。項目早期,UI 變化太快,測試跟不上節奏。但一旦核心流程趨於穩定,測試便成為加速器而非負擔。這個轉折點在 24.3.0 版本到來了。

實現方式

Scala 簡潔的語法天然適合構建小型測試 DSL。每個原子操作——打開文件、點擊關閉按鈕、斷言標籤面板為空——都成為可讀的構建塊:

@Test def openAndCloseTab(): Unit = {
    checkForEmptyTabPane()
    openFile(path)
    checkForNonEmptyTabPane()
    clickOn(lookup(UiNodes.LogFileHeaderTabs).query[StackPane](), MouseButton.SECONDARY)
    waitAndClickVisibleItem(CloseTabMenuItem.uiNode(fileId))
    checkForEmptyTabPane()
}

編寫前端測試的過程也推動了生產程式碼的改進。新增了一個 Service 層來抽象文件 I/O 和外部進程調用——這些變更在獨立於測試收益之外改善了整體架構。

測試發現了什麼

  • 應用程式關閉行為 — 在測試環境下,從未被正確清理的資源變得一目了然
  • 測試隔離 — 每個測試必須自行建立和清理狀態,由此暴露了若干關於共享 UI 狀態的隱性假設
  • 效能基準 — 監控測試執行時間,防止緩慢測試的逐漸累積
TestFX 運行 LogoRRR 測試套件——與使用者實際操作相同的交互流程,由測試自動執行

題圖攝影:Sora Shimazaki,來自 Pexels。