---
# System prepended metadata

title: Clean Code - Ch09 單元測試
tags: [Clean Code, Book]

---

# Clean Code - Ch09 單元測試
測試代碼與Production Code同等重要，甚至更重要。測試代碼腐化會導致產品程式接著腐化，引發惡性循環。

## 1. TDD 3 大法則
訂定目標，用最簡單的方式，專注達成目的，這就是 TDD 的精神。
1. 在寫好一個會報錯的測試代碼前不寫任何 Production Code
用一個失敗的測試來展示出Production Code的問題點
2. 一次只寫一個會報錯的錯誤場景
專注於目前的問題，一次只處理一件事
3. 只寫可以通過當前錯誤的 Production Code
不寫與目前問題無關的代碼，多寫多錯

## 2. 讓測試程式整潔
測試代碼依然要保持整潔，不然到最後雜亂無章的測試代碼也會被拋棄。沒有測試代碼之後就會出現惡性循環，變成不敢修改 Prodcution Code 導致軟體品質下降。
測試程式與產品程式一樣重要，撰寫時該遵守的規則還是要遵守，不能因為它是測試代碼就不在意變數的命名或排版等等。

## 3. 測試帶來更多的好處
如果沒有好好的維護測試代碼，長久下來就會變得不敢隨便的動Production Code，因為你不能保證新的改動不會造成問題

## 4. 整潔的測試
整潔的測試只有一件事要注意，那就是可讀性，測試代碼要寫的乾淨整潔，讓人好懂。

## 5. 測試代碼的function
當你的測試代碼寫多了之後，你可能會發現有很大一部分會一直重複，這時候你可以幫他建立測試代碼用的function，讓你的測試代碼可以變得簡短而且好閱讀
這種測試代碼的function不會在你剛開始寫測試代碼時就特別設計的，而是經過持續重構你的測試代碼而得出來的

## 6. 雙重標準
測試程式注重可讀性，可以犧牲效率。

## 7. 一個測試一次斷言 (Assert)
斷言數量越少越好，你就可以越專注在你正在解決的問題上，而且也符合前面說的TDD的原則

## 8. 一個測試一個概念
一個測試案例裡面只檢測一件事，專注於目前的問題

## 9. FIRST 整潔的測試遵循五個法則
1. **Fast：** 快速 
測試代碼執行的速度要夠快，因為你一個function通常都至少會寫2、3個測試代碼
這樣會導致你每次執行測試時都會跑很多個function
如果不夠快會導致測試的時間變很久

2. **Independent：** 獨立
每個測試代碼能夠獨立運行，不依賴於其他測試程式

3. **Repeatable：** 可重複性
測試代碼應該要在任何系統環境都能夠執行，減少因環境因素而產生測試失敗的問題

4. **Self-Validating：** 自我驗證
測試程式應該要輸出bool。不管是測試成功或失敗。測試的結果應該可以直接看到而不是透過log之類的去看測試的結果，如果看log時理解成錯誤的意義的話，這樣就會導致你可能會去把正確的測試代碼改成錯的

5. **Timely：** 及時
Production Code要在測試代碼寫完後再寫。如果先寫Production Code再寫測試代碼的話，你可能會覺得測試代碼很難寫，而必須回去先做重構才能寫

###### tags: `Clean Code` `Book`