首先這本書是免費的。
其次這本書是開源的。
如果你想學習go和TDD(測試驅動開發)的話,這本書是不錯的選擇。
就個人經歷而言,學習go語言目前比較好的材料是https://gobyexample.com,通過例子學習go語言,事半功倍。
而這本使用測試驅動開發的方式學習go語言內容則更為立體,非常適合大家在學習go語言的同時也對測試驅動開發有一定的了解。
什么是測試驅動開發
概念很大,簡單來說,測試驅動開發是一種精神,就是先寫用例再寫實現代碼的精神。
測試驅動開發其實是這樣工作的
- 先寫單元測試用例,測一個不存在的功能或者函數
- 運行單元測試用例,如果失敗,則修改實現,直到測試用例通過
- 添加更多的測試用例
- 重復步驟2,3並進行重構,直到所有的功能都測試用例並且用例都運行通過
書上的例子
通過書上的例子可以對上面的步驟有一個感性的認識。
比如實現一個加法的函數,我們可以先寫測試用例去測試這個函數,這個函數的名字是Add(int,int),這是步驟1
package integers
import "testing"
func TestAdder(t *testing.T) {
sum := Add(2, 2)
expected := 4
if sum != expected {
t.Errorf("expected '%d' but got '%d'", expected, sum)
}
}
接着運行用例,此時自然是會失敗,因為Add()函數我們並未實現。錯誤如下:
./adder_test.go:6:9: undefined: Add
接下來實現Add()函數,以便讓用例可以通過,這里有個規則,就是不要過度實現。
只為測試的運行編寫最少量的代碼並檢查失敗測試的輸出。
比如你會看到這樣的我們的實現是這樣的
package integers
func Add(x, y int) int {
return 0
}
這可以讓我們的代碼編譯通過,這樣就可以看到到底是哪個用例出了什么問題了
adder_test.go:10: expected '4' but got '0'
下面編寫足夠的代碼使其通過。
func Add(x, y int) int {
return 4
}
呃!!!!你這是在開玩笑嗎?這樣可以嗎?
這樣真的可以。
很明顯,現在測試用例是通過的,我們Add()方法也工作的很好,這是滿足需求的,不是嗎?
好吧,下面就有意思了。再增加一個測試用例
func TestAdder(t *testing.T) {
sum := Add(2, 2)
expected := 4
sum1 := Add(3, 5)
expected1 := 8
if sum != expected {
t.Errorf("expected '%d' but got '%d'", expected, sum)
}
if sum1 != expected1 {
t.Errorf("expected '%d' but got '%d'", expected, sum)
}
}
運行會報錯,所以我們單純return 4的實現是不對的,因為不夠靈活,沒能cover到大部分的場景。
那么就重構吧。
func Add(x, y int) int {
return x + y
}
現在所有的用例都可以通過了。
那么Add()函數的實現也就差不多了。
如何學習
把書上的代碼按順序抄一遍並運行起來。
特別是重構的部分,有時候會顯得很麻煩,不過這個麻煩的地方往往是精華。