好书推荐:使用测试驱动开发的方式学习go语言
首先这本书是免费的。
其次这本书是开源的。
如果你想学习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()函数的实现也就差不多了。
如何学习
把书上的代码按顺序抄一遍并运行起来。
特别是重构的部分,有时候会显得很麻烦,不过这个麻烦的地方往往是精华。