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

编写覆盖率测试

由于测试对现代开发工作至关重要,因此,了解测试覆盖了多少代码也是必不可少的环节。 您可以使用 Go 的内置工具为被测软件包生成测试报告:在测试命令中添加 
-cover
 标志即可:

  
go  
   
test  
   
-cover  
  

请注意,您还可以添加标志 
-v
 获得更详细的日志。

默认情况下,测试覆盖率会计算通过测试覆盖的语句的百分比。 在输出中,您可以看到当前覆盖了 80% 的代码。 (测试没有涵盖 main 函数。) 测试覆盖率计算是一个复杂的过程,如果您想了解更多信息,可以阅读
The Cover Story

可以将多种实参传递给 
go test -cover
。 例如,
go test
 在覆盖率计算中只考虑带有测试文件的软件包。 您可以使用 
-coverpkg
 将所有软件包添加到覆盖率计算中:

  
go  
   
test  
   
./...  
   
-coverpkg=./...  
  

您可以在这个
GitHub 仓库
中找到一个有效示例,它详细展示了您需要 
-coverpkg
 的原因。

使用标志 
-coverprofile
 将创建本地覆盖率报告文件。 这非常适合在 CI/CD 中运行测试,因为您会经常将报告发送到您喜爱的代码质量工具。

  
go  
   
test  
   
-coverprofile=output_filename  
  

您还可以使用 
go tool cover
 格式化报告。 例如,
-html
 标志将打开默认浏览器来显示图形报告。

  
go  
   
tool  
   
cover  
   
-html=output_filename  
  

您也可以使用 GoLand 的内置覆盖率报告。 如果您使用 Run with Coverage(使用覆盖率运行)选项,您将在侧面板上获得详细的覆盖率报告。

GoLand 还将提供高亮显示,覆盖的行为绿色,未覆盖的行为红色。 这对于决定后续要编写的测试非常有帮助。 在下图中,添加了一些额外代码,用于演示未被覆盖的代码的样子。

最后一个您需要了解的标志是 
-covermode
。 覆盖率默认根据语句覆盖率计算,但可以更改为考虑一条语句被覆盖的次数。 选项包括:

set:覆盖率基于语句。

count:计数是一条语句运行的次数。 它可以显示代码的哪些部分仅被轻微覆盖。

atomic:与计数类似,但用于并行测试。

在 CI/CD 中运行测试时,由于可以本地依赖 GoLand 获得直观的覆盖率报告,极其有必要了解运行覆盖率测试时使用的标志。 请注意,GoLand 默认使用 atomic 模式,在被覆盖语句左侧以绿色阴影表示覆盖率。

江达小记