---
# System prepended metadata

title: 'Ch1: What is TDD?'
tags: [bob]

---

# Ch1: What is TDD?

###### tags: `bob`


## 前傳

#### p01-05 書封面、感謝家人、作者介紹
#### p06-07 章節大部介紹
#### p08-13 章節細部介紹
#### p14-16 Introduction

- 教你把*需求變成測試，再把測試變成產品(production code)*
- 手把手帶你建立三個 app 

![](https://i.imgur.com/7y9L2ut.png)

1. Introduction
    - 解釋為什麼 TDD 這麼重要，還有他怎麼樣可以幫到你
2. **Beginning** TDD
    - 開始基礎的 testing ~
        - XCTest
        - test expressions
        - mocks
        - test expectations
    - 本章示範一個叫做 *Fitness* 的 app
3. TDD with **Networking**
    - 開始網路相關的 testing ~
        - RESTful networking calls
        - downloading images
        - using networking clients
    - 本章示範一個叫做 *Dog Patch* 的 app
4. TDD **in Legacy** Apps
    - 示範在 (不是 TDD 開始的專案) 上，開始 TDD
    - 本章示範一個叫做 *MyBiz* 的 app，他是一個 ERP 系統，可以在上面管理和規劃公司的資源

#### p17-21 開發環境介紹、版權聲明、論壇、[**source code 下載**](https://store.raywenderlich.com/downloads/2092)



## Ch 1: What Is TDD? (p22-27) 

#### ch1 裡面有五個小節
- **Why** should you use TDD?
- **What** should you test?
- But TDD takes **too long**! 
- **When** should you use TDD?
- Key points


![](https://i.imgur.com/2eGofSs.png)

### TDD Cycle
1. 寫一個會失敗的測試案例
2. 開始寫程式讓這個測試通過
3. 重構
4. 重複以上步驟

照著這個節奏有幾個優點：
- 確保你的 product code 是可被測試的
- 在寫 product code 時，程式碼會吻合你的需求
- 你的測試案例，==同時也是文件的一部份，他說明了程式碼是如何運作的==

### 幹嘛要用 TDD？
- 一個 "好的" 測試可以確保 app 可以運作得如你預期
- 然而什麼叫 "好的" 測試？
- 好的測試是：
    - 會失敗的（不會失敗的測試大概沒什麼用
    - 可重複性的（
    - 執行快速的（一秒完成、甚至更短更好
    - 可維護的
- 遵循著 TDD 提供的這套方法論，會讓你產出的測試是 "好的"

### 到底是要測試什麼東西？
- 測試覆蓋率不需要 100%，有些東西是可以不用測試的
- **應該要**測試的：
    - 幾乎所有你自己寫的程式碼
- 可以**不用**測試的：
    - 你依賴的函式庫，這個測試的責任是原作者應該要做的

### TDD 是不是花我很多時間！
真正的時間開銷並不是全都是在第一個版本上，還有後續的維護、新增功能、祓除既有功能...長遠來看這是划算的。

### 什麼時候做 TDD 比較好？
專案開發的任何時刻都可以做。如果你的專案是暫時性的，像是為了黑客松寫的。那你最好評估一下，或是只寫重要功能的測試就好了。

### 本節重點回顧
- TDD 給你一個方式可以寫"好的"測試
- "好的"測試是會失敗的、可重複的、執行快速的、可維護的
- 只寫你需要維護的程式碼的測試
- TDD 降低維護成本，同時有高品質的程式碼
- 對長期的專案，TDD 是最有效的開發方式