go代码测试综合指南(五)

编写基准测试

基准测试是一种测试代码性能的方式。 这些测试的目标是通过多次运行相同的函数来验证算法的运行时和内存使用情况。

要创建基准测试,必须满足以下条件:

测试函数需要位于 
*_test
 文件中。

函数名称必须以 
Benchmark
 开头。

函数必须接受 
*testing.B
 作为唯一形参。

测试函数必须包含一个 
for
 循环(以 
b.N
 为其上限)。

以下是 
Fooer
 函数基准测试的简单示例:

  
func  
   
BenchmarkFooer  
(  
b  
 *  
testing  
.  
B  
) {  
  
      
for  
   
i  
 :=   
0  
;   
i  
 <   
b  
.  
N  
;   
i  
++ {  
  
          
Fooer  
(  
i  
)  
  
    }  
  
}  
  

目标代码应在基准函数中运行 
N
 次,
N
 会在运行时自动调整,直到每次迭代的执行时间在统计上稳定。

在这个示例中,基准测试运行了 59,969,790 次,速度为每次迭代 19 ns。 基准测试本身不会失败。

如果要在 
CI/CD
 中保存和分析结果,您必须使用其他工具。 
perf/cmd
 为此目的提供了软件包。 
benchstat
 可用于分析结果,
benchsave
 可用于保存结果。

编写模糊测试

模糊测试是一种强大的测试技术,使用随机输入探索错误或边缘用例。 Go 的模糊算法非常智能,它会通过生成许多新的输入组合来覆盖代码中尽可能多的语句。

要创建模糊测试,必须满足以下条件:

测试函数需要位于 
_test
 文件中。

函数名称必须以 
Fuzz
 开头。

测试函数必须接受 
testing.F
 作为唯一形参。

测试函数必须使用 
f.Add()
 方法定义初始值,即种子语料库。

测试函数必须定义模糊目标。

我们来看一个综合示例:

  
func  
   
FuzzFooer  
(  
f  
 *  
testing  
.  
F  
) {  
  
      
f  
.  
Add  
(  
3  
)  
  
      
f  
.  
Fuzz  
(  
func  
(  
t  
 *  
testing  
.  
T  
,   
a  
   
int  
) {  
  
          
Fooer  
(  
a  
)  
  
    })  
  
}  
  

模糊测试的目标不验证函数的输出,而是使用意外输入查找潜在边缘用例。 默认情况下,只要没有失败,模糊测试就会无限期地运行。 在 CI/CD 中,应该使用 
-fuzztime
 标志指定模糊测试运行的最长时间。 如果代码具有较多分支,这种测试方式特别有趣。即使使用表驱动测试,也很难覆盖大量输入,而模糊测试有助于解决这个问题。

要在 GoLand 中运行模糊测试,请点击间距中的绿色三角形,然后选择 
Run | go test -fuzz(运行 | go test -fuzz)
选项,否则(无 
-fuzz
)测试将只使用语料库种子运行一次。

江达小记