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 狀態的隱性假設
- 效能基準 — 監控測試執行時間,防止緩慢測試的逐漸累積
題圖攝影:Sora Shimazaki,來自 Pexels。
