单元测试,其实并不是Go语言独有的。在整个编程界,单元测试相信对大部分同学来讲都不陌生。今天,咱们就看看啥是单元测试,以及在Go中,如何实现单元测试。
一、何为单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。比如你有一个函数,该函数完成了一个功能。那么你针对这个函数,写了几个小的测试用例来验证某些情况下,函数的功能是否正常。那么,把这些小的测试用例放在一个模块中,其实就组成了一个单元测试。
关于这个单元,具体范围是多大,还要根据项目情况实际分析,不宜过小,当然也不宜过大。
有了单元测试,我们对函数有任何修改之后,都可以跑一遍单元测试。,如果通过,说明我们的修改不会对函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。
这种以测试为驱动的开发模式(TDD:Test-Driven Development) 最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。所以,关于单元测试,我们总结几点如下:
- 单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证
- 单元测试的测试用例要覆盖常用的输入组合、边界条件和异常
- 单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug
- 单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug
二、Go中如何实现单元测试
我们知道了单元测试原来有这么大“益处”,那么在Go语言中如何实现呢?
首先,我们要学会写测试用例。这就要求你知道,如歌测试单个函数或方法,如何做基准测试,如何写出精炼短小的测试代码,如何使用mock等。
其次,要用一些原则来写出可测试的代码。比如高内聚、低耦合,比如单一职责,比如参数类型简单等。
最后,就是结合我们上一节 测试工具 中介绍的方法,写你自己的单元测试吧。接下来,咱们举一个简单的例子:
package main
func Add(a int, b int) int {
return a + b
}
func Mul(a int, b int) int {
return a * b
}
package main
import "testing"
func TestAdd(t *testing.T) {
if ans := Add(1, 2); ans != 3 {
t.Errorf("1 + 2 expected be 3, but %d got", ans)
}
if ans := Add(-10, -20); ans != -30 {
t.Errorf("-10 + -20 expected be -30, but %d got", ans)
}
}
$ go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
=== RUN TestMul
--- PASS: TestMul (0.00s)
PASS
ok example 0.007s
//指定运行单一用例
$ go test -run TestAdd -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
PASS
ok example 0.007s
单元测试相关的内容就总结到这里,你学废了吗?