代码测试
当开发人员开发好程序后还需要对代码进行测试,可以发现程序中可能存在的问题,测试可以分为传统测试和表格驱动测试,而表格驱动的单元测试技术相比传统测试有很多优点,下面对比下。
传统测试和表格驱动测试对比
1. 传统测试
看看下面一段传统测试代码,是对一个加法函数add的单元测试,assertEquals函数是测试函数,它的第一个参数表示期待的值,第二个参数是实际算出来的值,assertEquals会比较这两个值是否相等。
@Test public void testAdd() { assertEquals(3, add(1, 2)); assertEquals(2, add(0, 2)); assertEquals(0, add(0, 0)); assertEquals(0, add(-1, 1)); assertEquals(Integer.MIN_VALUE, add(1, Integer.MAX_VALUE)); }
传统测试缺点:
1. 测试数据和测试逻辑混在一起。上面add是测试逻辑,而里面的数字3 1 2是测试数据。
2. 出错信息不明确。比如说期待结果是 3 但实际算出来是4,但是它不会告诉你add(1,2)算出来是4,那么我们要去看代码,多一个环节。
3. 一旦一个数据出错测试全部结束。因为是assert,如果错了一批改一批。
2. 表格驱动测试
看看下面一段表格驱动测试代码。
定一个一个结构体,里面有几个属性值,表示期望a + b = c。然后再将一大段测试数据写在下面,就像一个表格一样。
tests := []struct { a, b, c int32 } { {1,2,3}, {0,2,2}, {0,0,0}, {-1,1,0}, {math.MaxInt32, 1, math.MinInt32}, } for _, test : range tests { if actual := add(test.a, test.b); actual != test.c { ........ } }
表格测试优点:
1. 分离测试数据于测试逻辑。
2. 明确的出错信息, 可以自定义。
3. 可以部分失败。
4. go语言的语法可以使我们更容易实践表格驱动测试。比如java写起来就很麻烦。
go 语言原生支持了单元测试,并且go语言属于表格驱动测试。
golang表格驱动测试
go语言使用测试非常简单,测试代码只需要放到以 _test.go
结尾的文件中即可。
basic.go 被测试文件保护被测试函数calcTriangle
package main import ( "fmt" "math" ) func triangle() { var a, b int = 3, 4 fmt.Println(calcTriangle(a, b)) } func calcTriangle(a, b int) int { var c int c = int(math.Sqrt(float64(a*a + b*b))) return c } func main(){ }
triangle_test.go 测试文件
package main import ( "testing" // go测试需要引入testing包,提供对 Go 包的自动化测试的支持 ) func TestTriangle(t *testing.T){ tests := []struct{ a, b, c int }{ {3, 4, 5}, {5, 12, 13}, {8, 15, 17}, {12, 35, 37}, } for _, tt := range tests { if actual := calcTriangle(tt.a, tt.b); actual != tt.c{ t.Errorf("Triangle(%d, %d) got %d, expacted %d", tt.a, tt.b, actual, tt.c) } } }
点击编辑器的run test 开始运行,得到结果是通过。
当然我们也可以在命令行中进行测试
查看代码覆盖率
执行go tool cover -html=c.out 默认打开浏览器显示结果
golang性能测试
golang的测试除了单元测试还可以性能测试。单元测试的测试用例以 Test
开头,性能测试以 Benchmark
开头