甚麼是 TDD、ATDD

大概說明一下甚麼是 TDD、ATDD

甚麼是 TDD / ATDD?

  1. TDD:Test Driven Development 測試驅動開發
  2. ATDD:Acceptance Test Driven Development 驗收測試驅動開發

比較正式的定義可以在 WIKI 找到,百度的解釋當中有一段我覺得很精闢

TDD = TFD + Refactoring (TFD – Test First Development)

TDD 是一種開發軟體的方式,具體一點說明就是開發 Production Code 之前,先寫測試,並加入重構的環節。
整個開發流程的順序就是 紅燈-> 綠燈-> 重構的循環

  1. 紅燈:寫一個失敗的測試
  2. 綠燈:撰寫 Production Code 通過測試
  3. 重構:重構程式碼

在一般的開發情境當中,往往工程師接獲到需求之後,就直接針對 Production Code 做開發,很容易陷入一團混沌的情況當中,往往需求完成了,但程式碼也包含了許多不必要的 Code。這很有可能演變成為壞味道的一種,難以理解,目標不明確的 Code。也會浪費額外的時間。

透過 TDD 方式開發,利用紅燈、綠燈、重構的循環,當一個一個的測試案例被滿足之後,再迭代下一個循環下去,直到所有測試案例被滿足,也就代表 Feature 被完成了。

整個軟體開發的流程會是非常明確的,撰寫的每一行程式碼都是為了要達成某個測試案例所撰寫,每一行都是有其存在的意義。但是 TDD 只是一個開發的方式,如何跟使用者需求結合,確保開發出來的軟體的確是能夠滿足使用者呢?

透過將使用者需求,拆分成一個一個的小目標,然後利用 TDD 的方式去完成它,最後將 Production Code 就會是滿足使用者需求的代碼,將 TDD 加上使用者需求拆解,成為各個驗收測試的這個環節,就是 ATDD

TDD 只是一種開發方式,其實也不用奉為聖經,事事遵從;軟體開發方式在每一個時代出現都有其時空背景、需要解決的問題;像是現在前端框架有很多選擇,但是選擇框架的時候有經驗的人都會先搞清楚,你選擇這個東西,打算要解決什麼問題?

TDD 的好處有很多,但是也有其不適用的情境,個人技術不達標,物件導向、重構、測試的基本如果都還不熟悉,基本上是無緣,建議先充實本身的技術能力;另外公司環境基礎建設不支持,可測試性極差的 Legacy Code,這些都不太適合開始 TDD

在這邊順便推一下 LeetCode,網站上的題目都很適合拿來練習 TDD