從 Java/Eclipse/JUnit 生態轉向 Delphi 2005,如何建立「重構 + 單元測試 + 持續整合」的敏捷環境?本文記錄 Delphi 2005 安裝、SP1 打補丁、DUnit 整合、IDE 套件精簡 (保留重構功能)、專案分層架構 (GUI/Core/TestCore)、測試專案輸出 DLL 供 DUnit 執行、工具菜單整合 DUnit 的完整實踐步驟。
| 元件 | 版本/來源 | 備註 |
| Delphi 2005 | Architect/Enterprise (含 Win32 + .NET) | 必須同時安裝 Win32 與 .NET 人格,否則重構功能失效 |
| SP1 更新包 | Borland 官方 / delphifans.com | 安裝緩慢需光盤映像,建議裝 |
| DUnit | SourceForge dunit project | 編譯為 DCU/DLL,加入 Library Path |
IDE 精簡:保留重構的最小套件清單
修改啟動參數 BDS.exe -rMyProfile,編輯註冊表 HKCU\Software\Borland\MyProfile\3.0\Known IDE Packages,僅保留下列套件 (其餘刪除或改名禁用):
"$(BDS)\Bin\vclmenudesigner90.bpl"
"$(BDS)\Bin\win32debugproide90.bpl"
"$(BDS)\Bin\htmide90.bpl"
"$(BDS)\Bin\iteidew3290.bpl"
"$(BDS)\Bin\SrcManIDE90.bpl"
"$(BDS)\Bin\todoide90.bpl"
"$(BDS)\Bin\htmlhelp290.bpl"
"$(BDS)\Bin\idefilefilters90.bpl"
"$(BDS)\Bin\startpageide90.bpl"
"$(BDS)\Bin\refactoride90.bpl" // 核心重構套件,必須保留
"$(BDS)\Bin\dbkdebugide90.bpl"
"$(BDS)\Bin\exceptiondiag90.bpl"
"$(BDS)\Bin\deployide90.bpl"
"$(BDS)\Bin\plugview90.bpl"
"$(BDS)\Bin\coreproide90.bpl"
"$(BDS)\Bin\IDETools90.bpl"
"$(BDS)\Bin\unittestide90.bpl" // DUnit IDE 整合
"$(BDS)\Bin\historyide90.bpl"
"$(BDS)\Bin\htmltidy90.bpl"
"$(BDS)\Bin\HTMLFmt90.bpl"
"$(BDS)\Bin\mlcc90.bpl"
"$(BDS)\Bin\delphivclide90.bpl"
"$(BDS)\Bin\delphicoreproide90.bpl"
"$(BDS)\Bin\win32debugide90.bpl"
"$(BDS)\Bin\htmlide90.bpl"
"$(BDS)\Bin\delphide90.bpl"
"$(BDS)\Bin\mtspro90.bpl"
"$(BDS)\Bin\mtsent90.bpl"
"$(BDS)\Bin\iteidenet90.bpl"
"$(BDS)\Bin\NetImportWiz90.bpl"
"$(BDS)\Bin\DataExplorer90.bpl"
精簡後啟動速度明顯提升,重構 (Rename/Extract Method/Change Params) 正常運作。
專案分層架構
ProjectGroup.groupproj
├─ GUI_App.bdsproj // VCL EXE:介面層 (Form、DataModule、報表)
└─ Core_Tests.bdsproj // Win32 DLL:核心邏輯 + 單元測試
├─ Core.pas // 純邏輯類別 (無 VCL 依賴)
├─ TestCore.pas // DUnit TestCase
└─ exports: RegisteredTests name 'Test'; // DUnit 掃描入口
- GUI 專案引用 Core 單元 (Search Path 指向 Core 目錄)。
- Core_Tests 專案輸出
Core_Tests.dll,DUnit 載入此 DLL 發現並執行測試。
- 實現「介面與邏輯分離、邏輯可獨立測試、GUI 輕量化」。
編寫第一個 DUnit 測試
unit TestBasic;
interface
uses TestFramework;
type
TBasic = class
public
function Add(A, B: Integer): Integer;
end;
TTestBasic = class(TTestCase)
private
FBasic: TBasic;
public
procedure SetUp; override;
procedure TearDown; override;
published
procedure TestAdd;
end;
implementation
function TBasic.Add(A, B: Integer): Integer;
begin Result := A + B; end;
procedure TTestBasic.SetUp;
begin FBasic := TBasic.Create; end;
procedure TTestBasic.TearDown;
begin FBasic.Free; end;
procedure TTestBasic.TestAdd;
begin CheckEquals(2, FBasic.Add(1, 1)); end;
initialization
RegisterTest('', TTestBasic.Suite);
end.
DUnit 整合到工具菜單
- Tools → Configure Tools → Add:
Title: &DUnit
Program: DUnit.exe (完整路徑)
Working Dir: $PROJECTDIR
Parameters: $PROJECTDIR\Core_Tests.dll (或通過 File→Load Test 手動選擇)
- 點擊工具欄 DUnit 圖示 → 彈出測試視窗 → Run All → 綠燈通過。
敏捷工作流
- 為既有 Core 邏輯補寫測試 (目標覆蓋率 > 80%)。
- 重構:Rename/Extract Method/Introduce Interface… 綠燈保護下放心重構。
- 新功能:先寫失敗測試 (Red) → 實現通過 (Green) → 重構。
- 建置腳本調用 DUnit 命令列模式 (
DUnit.exe /run Core_Tests.dll) 接入 CI。
避坑指南
| 坑點 | 解決 |
| 只裝 Win32 人格 → 重構失效 | 必須同時安裝 .NET 人格 |
| 刪太多 IDE 套件 → 重構/單元測試菜單消失 | 保留 refactoride90.bpl、unittestide90.bpl |
| DUnit 找不到測試 | DLL 必須 exports RegisteredTests name 'Test'; Uses TestFramework |
| 測試執行緒模式下 AV | DUnit 預設主執行緒跑測試,避免在測試中建立次要執行緒未同步 |
這套環境雖基於 Delphi 2005 (2005 年產品),但「分層架構 + 單元測試 + 重構保護」的核心思想完全適用於現代 Delphi 11/12 + DUnitX / DUnit2 + IDE Fix Pack 等工具鏈。
- 上一篇文章: Delphi 單例模式實作:線程安全的定時任務防重入保護
- 下一篇文章: Delphi 2005 開發 C# 應用程式:.NET 整合開發環境體驗與 DNS 解析範例
Copyright ©
程式碼之家 All Rights Reserved