56 lines
2.2 KiB
Markdown
56 lines
2.2 KiB
Markdown
|
|
---
|
|||
|
|
name: springboot-tdd
|
|||
|
|
description: 使用 JUnit 5, Mockito, MockMvc, Testcontainers 與 JaCoCo 進行 Spring Boot 的測試驅動開發 (TDD)。適用於功能開發、臭蟲修復或重構時。
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Spring Boot TDD 工作流 (Spring Boot TDD Workflow)
|
|||
|
|
|
|||
|
|
針對 Spring Boot 服務的 TDD 指引,旨在達成 80% 以上的測試覆蓋率(單元測試 + 整合測試)。
|
|||
|
|
|
|||
|
|
## 何時使用
|
|||
|
|
|
|||
|
|
- 開發新功能或 API 端點。
|
|||
|
|
- 修復 Bug 或進行程式碼重構。
|
|||
|
|
- 添加資料存取邏輯 (Data Access) 或安全性規則。
|
|||
|
|
|
|||
|
|
## 標準工作流
|
|||
|
|
|
|||
|
|
1. **先寫測試 (RED)**:撰寫會失敗的測試案例。
|
|||
|
|
2. **實作功能 (GREEN)**:編寫最少量的程式碼使測試通過。
|
|||
|
|
3. **重構優化 (REFACTOR)**:在測試通過的前提下優化程式碼架構。
|
|||
|
|
4. **檢查覆蓋率 (JaCoCo)**:確保關鍵路徑覆蓋完整。
|
|||
|
|
|
|||
|
|
## 測試策略與工具
|
|||
|
|
|
|||
|
|
### 單元測試 (Unit Tests)
|
|||
|
|
- **工具**:JUnit 5 + Mockito。
|
|||
|
|
- **模式**:Arrange-Act-Assert (AAA)。
|
|||
|
|
- **重點**:使用 `@Mock` 與 `@InjectMocks` 隔離外部依賴,專注於 Service 邏輯。
|
|||
|
|
|
|||
|
|
### Web 層測試 (Web Layer Tests)
|
|||
|
|
- **工具**:`@WebMvcTest` + `MockMvc`。
|
|||
|
|
- **重點**:針對 Controller 進行輕量級測試,驗證 HTTP 狀態碼與 JSON 回應格式(使用 `jsonPath`)。
|
|||
|
|
|
|||
|
|
### 整合測試 (Integration Tests)
|
|||
|
|
- **工具**:`@SpringBootTest` + `@AutoConfigureMockMvc`。
|
|||
|
|
- **重點**:啟動完整的 Spring 上下文與真實的資料庫進行端到端流量測試。
|
|||
|
|
|
|||
|
|
### 持久層測試 (Persistence Tests)
|
|||
|
|
- **工具**:`@DataJpaTest` + Testcontainers。
|
|||
|
|
- **重點**:使用 **Testcontainers** 啟動真實的資料庫鏡像(如 Postgres),取代 H2 記憶體資料庫,以模擬真實生產環境。
|
|||
|
|
|
|||
|
|
## 覆蓋率與斷言
|
|||
|
|
|
|||
|
|
- **檢查工具**:JaCoCo。目標 80%+,關鍵路徑 100%。
|
|||
|
|
- **斷言工具**:優先選用 **AssertJ** (`assertThat`) 以提升閱讀性。
|
|||
|
|
- **例外測試**:使用 `assertThatThrownBy(...)`。
|
|||
|
|
|
|||
|
|
## 常用指令
|
|||
|
|
|
|||
|
|
- **Maven**:`mvn verify` (執行測試並產出覆蓋率報告)。
|
|||
|
|
- **Gradle**:`./gradlew test jacocoTestReport`。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**核心原則**:保持測試速度快、具備隔離性且結果具備確定性 (Deterministic)。測試應專注於「行為」而非「實作細節」。
|