单元测试,它又称程序员测试。顾名思义,这就是程序员们本该做的自我检查工作之一。
在 Go 语言中,一个测试用例往往会由一个或多个测试函数来代表,不过在大多数情况下,每个测试用例仅用一个测试函数就足够了。、
Go 程序编写三类测试,即:
- 功能测试(test)
- 基准测试(benchmark,也称性能测试)
- 示例测试(example)。
测试源码文件的主名称应该以被测源码文件的主名称为前导,并且必须以“_test”为后缀。每个测试源码文件都必须至少包含一个测试函数。
Go测试命名规范
- 对于功能测试函数来说,其名称必须以
Test
为前缀,并且参数列表中只应有一个*testing.T
类型的参数声明。 - 对于性能测试函数来说,其名称必须以
Benchmark
为前缀,并且唯一参数的类型必须是*testing.B
类型的。 - 对于示例测试函数来说,其名称必须以
Example
为前缀,但对函数的参数列表没有强制规定。
Go测试
传统测试
- 测试数据和测试逻辑混在一起
- 出错信息不明确
- 一旦一个数据出错测试全部结束
@Test public void testAdd() {
assertEquals(3, add(1, 2));
assertEquals(2, add(0, 2));
assertEquals(Integer.MIN_VALUE, add(1, Integer.MAX_VALUE));
}
表格驱动测试
- 分类测试数据和测试逻辑
- 明确出错信息
- 可以部分失败
- Go 语言的语法使得我们更易实践表格驱动测试
test := []struct {
a, b, c int32
}{
{
1, 2, 3},
{
0, 2, 2}.
{
math.MaxInt32, 1, math.MinInt32},
}
for _, test := range tests {
if actual := add(test.a, test.b); actual != test.c {
// 打印错误信息
}
}
测试案例
package test
import "math"
// 测试函数
func Calc(a, b int) int {
c:=int(math.Sqrt(float64(a*a+b*b)))
return c
}
calc_test.go
package test
import "testing"
func TestCalc(t *testing.T) {
tests:=[]struct{
a,b,c int }{
{
3,4