1、go test
-
在包目录内,所有以 _test.go为后缀名的源文件并不是go build构建包的一部分,它们是go test测试的一部分。
-
三种测试函数
- 测试函数是以Test为函数名前缀的函数,用于测试程序的一些逻辑行为是否正确;go test命令会调用 这些测试函数并报告测试结果是PASS或FAIL。
- 基准测试函数是以Benchmark为函数名前缀的函数,它们用于衡量一些函数的性能;go test命令会多次运行基准函数以计算一个平均的执行时间。
- 示例函数是以Example为函数名前缀的函数,提供一个由编译器保证正确性的示例文档。
-
go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的 main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。
2、测试函数
- 测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头,如下:
func TestName(t *testing.T) { // ... }
- t参数用于报告测试失败和附加的日志信息
- go test 命令如果没有参数指定包那么将默认采用当前目录对应的包(和 go build 命令一 样)。
- 测试失败的信息一般的形式是“f(x) = y, want z”,其中f(x)解释了失败的操作和对应的输出,y 是实际的运行结果,z是期望的正确的结果。
- mock函数的写法,其实这边直接在test函数里面对函数进行修改就可以了,但是为了保证运行之后其他保持函数本来的面目,这边加上defer来保证测试类测试完成返回,函数不变,具体写法:
func TestCheckQuotaNotifiesUser(t *testing.T) { saved := fucToTest //先保存一下函数中要被Mock的某个方法 defer func() { fucToTest = saved }() //测试类运行完以后要把函数还原回去 // Install the test's fake notifyUser. fucToTest = func(user, msg string) { //重写函数 ....... } // ...rest of test... }
3、测试覆盖率
参考原文
4、基准测试
- 基准测试函数和普通测试 函数写法类似,但是以Benchmark为前缀名,并且带有一个 *testing.B 类型的参 数;
- *testing.B 参数除了提供和 *testing.T 类似的方法,还有额外一些和性能测量相关的方法。它还提供了一个整数N,用于指定操作执行的循环次数。
- 我们需要通过 -bench 命令行标志参数手工指定要运行的基准测试函数。该参数是一个正则表 达式,用于匹配要执行的基准测试函数的名字,默认值是空的。其中“.”模式将可以匹配所有 基准测试函数:
go test -bench=.