Golang 单元测试
哲学
测试只能证明你的代码有问题,不能证明你的代码没有问题。
测似的粒度
老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,
少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的
标准,当然,这种自信也可能是种自大)。如果我的编码生涯中不会犯这种典型的
错误(如:在构造函数中设了个错误的值),那我就不会测试它。我倾向于去对
那些有意义的错误做测试,所以,我对一些比较复杂的条件逻辑会异常地小心。
当在一个团队中,我会非常小心的测试那些会让团队容易出错的代码。
个人理解:测试需要测有意义的东西,而不是盲目的100%覆盖,需要的是恰到好处
的UT。
TDD(测试驱动开发)
个人理解:
1. 测试不能帮助你写出优秀的设计,只能保证你写的代码不出错。
2. 软件开发是一种发现问题解决问题的过程,TDD并不能达到这样
的效果。
3. TDD保证代码正确,但是什么来保证TDD的case是正确的。
4. TDD的好处大多是理论上的,实际上是不是只有做过才知道。
5. 决定软件工艺的还是设计,程序员需要知道怎么思考,怎么设计,
怎么测试,而不是教条主义的照搬某某理论,某某Best Practice。
6. 软件工程是没有银弹的,TDD也许适合你的项目,你的编程风格,
但是不一定适合所有人。
总结: 软件需要的是恰到好处的设计和单元测试。
Go语言中的单元测试
go语言自带 testing 测试框架, go test 命令可以运行单元测试和性能测试。
使用
exa.go 文件
package main import "fmt" func Add(x, y int) int { return x + y } func main() { x, y := 1, 2 fmt.Println(Add(x, y)) }
exa_test.go 测试文件
package main import ( "testing" ) func TestAdd(t *testing.T) { if x := Add(1, 3); x != 4 { t.Error("error in test Add") } if x := Add(1, 3); x != 5 { t.Error("error in test Add 5") } }
# 在当前文件夹运行go test便可以运行测试 go test
使用原则
1. 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码
2. 你必须import testing这个包
3. 所有的测试用例函数必须是Test开头
4. 测试用例会按照源代码中写的顺序依次执行
5. 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是
测试状态
6. 测试格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,
但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名。
7. 函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,
说明测试不通过,调用Log方法用来记录测试的信息。