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 模式,在被覆盖语句左侧以绿色阴影表示覆盖率。