今天一開機、跑個 go run main.go
,結果伺服器靜靜地拒絕啟動。
終端上沒報錯、沒 panic、沒警告——就像個沉默的同事。
結果一查版本控制歷史,真相大白:
有人(可能是我昨天的深夜自己 😭)在 merge 過程中 意外撤銷了 main.go 裡的新功能初始化。
Billing、Files、Batch 三個模組全被清空,imports
消失、service
沒建、handler
沒註冊。
這一刻,我彷彿聽見 Go compiler 在耳邊輕聲說:「你昨天不是 commit 嗎?怎麼今天變成空的?」
於是今天的第一個任務,就是「考古 + 復原」。
從 log 和 commit 訊息推回去,一步步重建出原本應該存在的初始化邏輯。
這段短短幾行,讓我感受到系統設計的重要性:只要初始化沒做好,整個 API 伺服器等於殘廢。
同時也順手修掉了之前一個小坑:RegisterHandlers()
的簽名不一致,呼叫時參數數量對不上。這次直接補上正確的函數呼叫,終於能順利編譯通過。
既然主程式都復原了,下一步自然是——寫測試!
今天正式建立了 基本單元測試框架。
testing
+ github.com/stretchr/testify/assert
internal/api/services/basic_test.go
、internal/api/services/service_test.go
項目 | 數值 |
---|---|
初始覆蓋率 | 0.0% |
完成覆蓋率 | 1.3% |
雖然數字看起來像個玩笑,但這 1.3% 是象徵性的突破——代表系統正式進入「可測試、可維護」階段。
服務 | 方法 | 覆蓋率 | 備註 |
---|---|---|---|
Billing | NewBillingService() / GetUsageRecords() |
100% | 建構與查詢 |
File | NewFileService() / ValidateFile() |
91.7% | 大小與格式驗證 |
Batch | NewBatchService() |
100% | 結構測試通過 |
測試內容包括:字符串 / 數字 / 布林值驗證、請求與回應結構、錯誤邏輯與邊界條件。
今天同時新增了三份 migration SQL:
編號 | 檔案 | 功能 |
---|---|---|
011 | add_billing_tables.sql |
新增計費方案與使用記錄表 |
012 | add_file_tables.sql |
新增檔案存儲表 |
013 | add_batch_tables.sql |
新增批次通知、目標、模板表 |
三個 migration 一次執行成功,資料庫 schema 終於正式完整支援 Billing、File、Batch 三大模組。
這也意味著:從今天起,後端架構正式具備「企業級計費/檔案/批次發送」三要素。
執行 ./scripts/testing/test_api.sh
驗證結果如下:
API | 狀態 | 說明 |
---|---|---|
GET /api/v1/billing/usage |
✅ | 正常返回空資料 |
GET /api/v1/billing/plans |
✅ | 正常運作 |
GET /api/v1/files |
✅ | 正常分頁資料 |
POST /api/v1/batch/notifications |
⚠️ | 需有效 project_id |
POST /api/v1/files/upload |
⚠️ | UUID 格式未通過驗證 |
整體來看,所有 API 都可正常呼叫,只是部分需額外參數驗證。
今天其實是一場救援行動。main.go
被 rollback,services
消失、routes
全掛,連 database migration
都得重新跑。
但整體修復完後,我反而覺得這是一堂寶貴的課:
系統穩定性的第一步,是讓你的 main.go 永遠不再神秘消失。
這代表要:
同時,也要讓測試框架不再只是樣板。那 1.3% 不是結束,而是起點。
今天沒有新功能,也沒有 flashy demo。但在工程世界裡,能讓程式「正常啟動」就是最大的勝利。