Schema Inspector 抽象介面與 mock inspector 第一版實作紀錄
1. 驗證節點摘要
| 項目 | 內容 |
|---|---|
| 驗證節點名稱 | Schema Inspector 抽象介面與 mock inspector 第一版 |
| 驗證日期 | 2026-05-30 |
| 程式 repo | hs-device-control-template |
| 實作 commit | e8fd1b0 |
| 驗證分支 | poc/nmodbus-tcp |
| 自動測試結果 | dotnet test 通過 286 個測試 |
| 狀態 | 已完成第一版驗證 |
本節點依「Schema Inspector 抽象介面與 mock inspector 實作前確認」執行,只建立抽象介面、mock 實作與單元測試。
2. 已完成範圍
| 類型 | 完成內容 |
|---|---|
| 抽象介面 | 新增 ISchemaInspector |
| Request model | 新增 SchemaInspectRequest |
| Result model | 新增 SchemaInspectResult |
| Mock 實作 | 新增 MockSchemaInspector |
| Error code | 新增 SchemaInspectionFailed |
| 實作紀錄 | 新增程式 repo 文件 schema-inspector-interface-mock-implementation-record.md |
| 測試 | 新增 SchemaInspectorTests |
3. 明確未納入
| 未納入項目 | 說明 |
|---|---|
MySqlConnector | 未新增任何 MySQL 套件 |
| 真實 MySQL 連線 | 未使用 host、port、user、password、dbname |
information_schema 查詢 | 未建立 SQL 查詢 |
| DDL Executor | 未執行 CREATE TABLE、ALTER TABLE、DROP |
| ConsoleHost 啟動自動建表 | 尚未串接 |
| Schema Initializer | 尚未串接 |
4. 測試覆蓋
| 測試項目 | 實際驗證 |
|---|---|
| 空 schema snapshot | MockSchemaInspector.Empty() 可回傳空 table 清單 |
| 完整 schema snapshot | 可回傳 table、column、index |
| table 篩選 | ExpectedTables 可限制回傳 table |
| 隱藏 index/comment | IncludeIndexes = false、IncludeComments = false 可移除 index/comment |
| 讀取失敗 | MockSchemaInspector.Failed() 回傳 SchemaInspectionFailed |
| request 為 null | 回傳標準錯誤,不丟未處理 exception |
| Dry Run 缺 column/index | mock snapshot 可驅動 GenerateDryRunPlan 產生 ADD COLUMN / ADD INDEX |
| Dry Run 欄位差異 | mock snapshot 可驅動 ManualReviewItems |
5. 實際測試結果
執行指令:
dotnet test tests\HS.DeviceControl.Core.Tests\HS.DeviceControl.Core.Tests.csproj
dotnet test
結果:
| 測試專案 | 通過數 |
|---|---|
HS.DeviceControl.Core.Tests | 141 |
HS.DeviceControl.WorkflowSimulation.Tests | 11 |
HS.DeviceControl.Adapters.Tests | 108 |
HS.DeviceControl.ModbusPoc.Tests | 26 |
| 合計 | 286 |
執行時仍會出現 .NET 5.0 已不受支援的 NETSDK1138 warning,這是目前專案指定版本的既有限制。
6. 實際效果
目前已可以在不接觸真實 MySQL 的情況下,建立目前 schema snapshot,並交給既有 MySqlSchemaSqlGenerator.GenerateDryRunPlan 做差異比對。
這代表下一步若要實作真實 MySqlSchemaInspector,可以沿用同一個介面與 result model;若要先補更多測試,也可以先用 mock inspector 完成。
7. 建議下一步
建議下一步進入:
Schema Inspector 與 Dry Run Plan 串接服務設計
此步驟仍可不導入 MySQL 套件、不連線 DB、不執行 DDL,先整理是否需要一個 SchemaDryRunPlanner 類型的服務負責:
- 呼叫
ISchemaInspector取得目前 schema。 - 接收目標
SchemaDefinition。 - 呼叫
MySqlSchemaSqlGenerator.GenerateDryRunPlan。 - 回傳 plan 與 warnings。