大家好,我是猫头虎博主!今天我们来聊聊Go语言中的一个相当酷的特性——Go 1.7中引入的子测试和子基准测试。这个功能不仅让我们的代码更加简洁、易于维护,而且还为我们提供了更精细的控制测试运行的能力。如果你对Go语言或者编程测试感兴趣,那就别错过这篇文章了哦!🐱👀
在Go 1.7版本中,testing
包通过在T
和B
类型上引入了一个Run方法,为我们带来了子测试和子基准测试的创建能力。这个改变不仅优化了失败处理方式,还提供了更细致的命令行控制,以及更加简洁和可维护的代码结构。
在深入了解之前,让我们先看看Go中常见的测试编写方法。通过遍历测试用例切片来实现一系列相关检查:
func TestTime(t *testing.T) {
testCases := []struct {
gmt string
loc string
want string
}{
{"12:31", "Europe/Zuri", "13:31"}, // incorrect location name
{"12:31", "America/New_York", "7:31"}, // should be 07:31
{"08:08", "Australia/Sydney", "18:08"},
}
// ...
}
这种被称为表驱动测试的方法,相比于为每个测试重复相同的代码,减少了代码重复,并简化了添加更多测试用例的过程。
在Go 1.7之前,无法使用相同的表驱动方法进行基准测试。基准测试是测试整个函数的性能,因此遍历基准测试只会将它们作为单个基准测试进行度量。
func BenchmarkAppendFloat(b *testing.B) {
benchmarks := []struct{
name string
float float64
fmt byte
prec int
bitSize int
}{
{"Decimal", 33909, 'g', -1, 64},
// ...
}
// ...
}
Go 1.7中使用Run
方法,可以将一组基准测试表达为一个顶级基准测试。
Go 1.7还为创建子测试引入了Run
方法。这是我们之前示例的使用子测试重写版本:
func TestTime(t *testing.T) {
// ...
for _, tc := range testCases {
t.Run(fmt.Sprintf("%s in %s", tc.gmt, tc.loc), func(t *testing.T) {
// ...
})
}
}
子测试和子基准测试可以通过命令行上的-run
或-bench
标志单独指定。
子测试和子基准测试可用于管理公共的设置和拆卸代码。
子测试允许对并行性进行细粒度控制。
可以使一组测试彼此并行运行,但不与其他并行测试并行。
关键点 | 描述 |
---|---|
表驱动测试 | 通过遍历测试用例简化测试编写 |
子测试和子基准测试 | Go 1.7引入,允许更精细的测试控制 |
命令行控制 | 使用-run和-bench标志精确运行特定测试 |
设置和拆卸 | 管理公共代码,确保测试的正确初始化和清理 |
并行性控制 | 细粒度的并行测试控制,优化测试性能 |