許多資料庫開發者習慣在查詢分析器裡寫好存儲過程,隨手跑幾筆測試資料,覺得沒問題就上線。這種「臨時測試」雖然快,卻藏著風險:測試案例不留存、邊界條件易遺漏、重構時無回歸保護。當系統規模增長、業務邏輯變複雜,這套作法終將成為技術債。
單元測試針對最小可測單元(如單一 Stored Procedure、Function、Trigger)進行自動化驗證。不同於使用者驗收測試(UAT)關注 UI 流程,單元測試聚焦於程式邏輯正確性。採用極限編程(XP)風格的單元測試,能帶來五大效益:
將零散測試查詢封裝為可排程執行的測試存儲過程,失敗時自動發送郵件通知。當生產環境出錯,能快速判斷是誰的變更導致,避免「背黑鍋」情況。
不必一次補齊所有舊代碼測試。新代碼、修改過的程序「強制」附加測試,久而久之核心舊代碼與新代碼都將擁有測試覆蓋。捕捉一個上線前的 Bug,節省的成本遠超撰寫測試的時間。
測試腳本展示各種參數組合的呼叫方式與預期結果,新成員閱讀測試即可理解 API 契約,比過時的 Word 文檔可靠得多。
遵循 TDD(測試驅動開發)原則,先定義「這個功能應該長什麼樣、驗收標準是什麼」,再實作邏輯。這迫使開發者在動鍵盤前先思考需求、邊界與例外情況。
有了測試套件,大膽重構效能不佳的查詢、正規化資料表結構、移除游標,跑一次測試綠燈即可安心部署。
[Schema].[Test_被測物件_情境_預期結果],例如 Finance.Test_CalculateInterest_ZeroPrincipal_ReturnsZero。tsqlt.RunAll 步驟,失敗即阻擋部署。| 誤區 | 對策 |
|---|---|
| 「資料庫測試太慢」 | 使用交易回滾隔離測試、tSQLt FakeTable 模擬資料、平行執行測試套件。 |
| 「外部相依難測試」 | tSQLt SpyProcedure、MockFunction 隔離相依。 |
| 「測試代碼也是代碼,會爛」 | 同樣遵循 Clean Code 原則,測試碼重構、去重複、命名清晰。 |
單元測試不是「多做的事」,而是「少踩坑的保險」。從下一個新存儲過程開始,寫一個測試,跑一次綠燈,體會「自信上線」的感覺。久而久之,資料庫代碼庫將擁有穩固的安全網,讓團隊在重構、升級、交接時都能從容應對。