首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

精通 Grails:測試驅動開發與 Grails 內建測試機制

     編輯:Java 相關知識

我是測試驅動開發(TDD)堅定擁護者。《The Productive Programmer》作者 Neal Ford 說:「不測試所寫代碼就是失職。」《Working Effectively with Legacy Code》作者 Michael Feathers 將「遺留代碼」定義為「未經測試的任何軟體」。我習慣每寫一行生產代碼,就寫兩行測試代碼。本文將展示 Grails 如何協助您進行應用程式測試。

第一個測試:從領域類別開始

執行 grails create-domain-class HotelStay 會同時在 grails-app/domain 產生空類別,在 test/integration 產生繼承 GroovyTestCase 的測試類別(含空的 testSomething())。GroovyTestCase 建立在 JUnit 3.x 之上,提供 assertEquals、assertTrue、assertNull 等斷言方法。Grails 為向後相容 Java 1.4 仍採用 JUnit 3.x,但您仍可引入 JUnit 4.x 或 TestNG 等框架。

單元測試即可執行的文件

需求文件易過時,優秀的測試套件可成為「可執行的文件」:以代碼表達活著、不斷演進的專案需求。行為驅動開發(BDD)更進一步,easyb 等框架允許以使用者故事撰寫測試,若使用者接受,可完全取代傳統 Word 文件。將測試對應需求,配合 CruiseControl 等持續整合伺服器,即構成安全網,確保新功能不破壞既有軟體。

撰寫有價值的測試:toString() 格式驗證

為 HotelStay 加入 hotel、checkIn、checkOut 欄位,並實作 toString() 輸出如「Hilton (Wednesday to Sunday)」。測試使用 assertToString(GroovyTestCase 提供)驗證格式,比 assertEquals 更具表達力。執行 grails test-app 即可看見測試通過,HTML 報告顯示詳細結果。

加入 Scaffold 控制器與視圖微調

建立 HotelStayController 並設定 def scaffold = HotelStay。預設日期選擇器包含時分秒,執行 grails generate-views HotelStay 後在 create.gsp、edit.gsp 的 <g:datePicker> 加入 precision="day" 僅顯示日期。

單元測試與整合測試的語義差異

Grails 支援兩種測試:單元測試 隔離測試類別;整合測試 在完整運行環境(含資料庫、Spring 容器)中測試。語法相同,差異在語義。所有 create-* 指令預設產生整合測試,許多測試需完整環境,故預設用整合測試無妨。單元測試適合測試非核心 Grails 類別,建立指令為 grails create-unit-test MyTestUnit。命名需唯一,避免與整合測試同名衝突(建議單元測試用 UnitTests 後綴)。

測試驗證錯誤訊息客製化

在 HotelStay 加入 static constraints = { hotel(blank:false) ... },並在 messages.properties 定義 hotelStay.hotel.blank=Please provide a hotel name。測試使用 validate() 與 hasErrors() 驗證失敗,並透過 errors.getFieldError('hotel') 取得 FieldError,檢查錯誤代碼包含 hotelStay.hotel.blank。println 輸出可在 HTML 報告的 System.out 連結查看。Elvis 運算子 ?: 讓輸出更簡潔。

測試自訂驗證邏輯

需求:checkOut 必須晚於 checkIn。在 constraints 加入 checkOut(validator:{val, obj -> return val.after(obj.checkIn)})。在 messages.properties 定義對應錯誤訊息。測試建立 checkOut 早於 checkIn 的實例,驗證 validate() 失敗且錯誤代碼正確。

測試自訂 TagLib

列表與顯示視圖的日期仍含時間戳,建立 DateTagLib 提供 <g:customDateFormat>,支援 format 屬性(預設 MM/dd/yyyy)。在 list.gsp、show.gsp 以此標籤包裹 fieldValue。測試直接實例化 DateTagLib 呼叫 customDateFormat 閉包,驗證預設格式與自訂格式(如 EEEE 輸出星期)正確。

結語

Grails 內建優秀測試工具,撰寫測試並對應使用者情境,即可獲得持續更新的可執行文件。下一篇將探討 Grails 的 JSON 支援:控制器產生 JSON、GSP 中使用 JSON,敬請期待。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved