go 测试简记

52 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

在我们日常的开发中,单元测试是验证程序功能的重要途经。Go语言自带了测试功能,不需要像Java那样纠结Junit的版本号或者是其他测试框架。

在go中,测试只需要新建一个文件名以_test.go结尾的文件,然后在该文件中定义一个以Test开头的函数,这个函数就是一个单元测试。在这个函数中,我们可以调用程序中的函数或方法,并使用Go语言自带的testing包提供的函数来检查函数或方法的输出是否符合预期。

假设我们有一个calc.go的文件,里面有一个Add函数,用来计算两个数的和,为了给它写测试,我们新建一个calc_test.go的文件,然后在里面写一个测试函数,如下:

package calc
func TestAdd(t *testing.T) {
    if Add(1, 2) != 3 {
        t.Error("Add(1, 2) != 3")
    }
}

这里假定了原文件所属的包名是calc,实际上go还给了单元测试文件一个特别的东西,那就是_test包,这个包可以让我们隔离测试代码和原代码,这样就不会影响到原代码的编译和运行。

因为go语言的包导入其实比较容易在测试出现反向依赖的问题,这时候为了几个测试让整个程序出了循环依赖的问题,就得不偿失了,在这种情况下,我们可以使用_test包来解决这个问题。不过在这个包里测试就需要导入原来的包才能运行了。

比起Java的junit,go的测试也有不好的地方,那就是它本身没有比较好的支持表驱动测试,Java中的测试可以随意指定运行的函数,将整个测试简化为一个函数,而go的测试却被限制了函数签名,哪怕是它的子测试使用t.Run提供了测试名称,里另一个参数也必须使用测试函数同样的签名 func(t *testing.T)。很依赖闭包,有时候有些不够简洁。