---
# System prepended metadata

title: 單元測試
tags: [CleanCode]

---

###### tags: `CleanCode`
<STYLE>
p,li,oi,h3{
font-family:"微軟正黑體";
}
</STYLE>
# 單元測試
* 應該要測試在所有邊界條件中，程式是否能正確運作。
#### 測試驅動軟體開發(Test Driven Development, TDD)
TDD的三大法則：
在任何時候保持正常運作。
:::success
* 撰寫一個測試失敗的單元測試前，不可撰寫任何產品程式。
* 只撰寫剛好無法通過的單元測試(不能編譯也算無法通過)
* 只撰寫剛好能通過當前測試失敗的產品程式
:::

#
#### 單元測試
* 使程式保持擴充彈性、可維護性，以及可再利用性。
* 測試程式與產品程式一樣，需要具有**可讀性**(闡明性、簡明性、言簡意賅的表達力)
*測試程式持續重構的過程中，可以演化成測試API(建立一連串韓式與功用程式，間接使用被程式設計師用來操縱系統的API)*
* 一個測試一個概念，在每個測試函式中只測試一個概念。
* 在每個概念中，盡量最小化斷言(assert)敘述的數量(判斷A是否......)。
#
#### 整潔的測試，須遵守F.I.R.S.T.法則
* Fast(快速)
測試必須執行速度快
* Independent(獨立)
測試程式不該相互依賴。必須能按照自己想要的順序進行測試
* Repeatable(可重複性)
可以在任何環境下重複執行。
* Self-Validating(自我驗證)
測試程式應該輸出布林值，不管測試通過或失敗。用以分辨測試程式是否通過。
* Timely(及時)
撰寫測試程式要及時。要恰好在使其通過的產品程式**之前不久**被撰寫。因為若在撰寫產品程式後撰寫測試程式，可能會發現難以被測試。

例：
![](https://i.imgur.com/cn0tfCU.png)
![](https://i.imgur.com/eTWKDAs.png)

---