golang代码覆盖率测试
1.概述
测试是开发过程的重要部分,也是软件开发生命周期的关键部分。 它可以确保应用程序正常运行和满足客户需求。 本文将涵盖关于 Go 测试的所有须知事项。 我们将从一个简单的测试函数开始,通过更多工具和策略帮助您掌握 Go 中的测试。
在一个流程规范的项目里,如果想发布一行代码到生产环境,都需要完整的测试流程,如果是向外网发布一个功能或版本,那么更需要进行完整的功能测试,其中就包括白盒测试和黑盒测试。尤其是在游戏行业,因为玩法逻辑复杂,很多逻辑很难考虑到,因此覆盖率验证是一个必备的一个流程。比如现在的团队就要求放出的游戏版本的代码覆盖率需要达到100%才算是达到发版标准,因此覆盖率测试在保证代码质量上扮演者重要角色。我们通过覆盖率可以看到我们的代码有哪些是已经跑到的,有哪些是特殊情况绕过了尚未验证,因此通过代码覆盖率我们可以对整个代码逻辑有充分的认识和判断。这篇文章主要介绍如何对Go的代码建立覆盖率,而Go的覆盖率建立依赖go test和go tool cover。
2.编写单元测试代码
每个模块跟一个test代码:
bool_test代码
package utils
import "testing"
func TestBtoI(t *testing.T) {
b := true
i := BtoI(b)
if i != 1 {
t.Errorf("error")
}
b = false
i = BtoI(b)
if i != 0 {
t.Errorf("error")
}
}
模块以_test结尾;函数以Test开头;输入参数是t *testing.T
3.覆盖率测试
进入项目的根目录,
go test -cover -covermode=count --coverprofile=coverage.out即可:
go test -cover -covermode=count --coverprofile=coverage.out ./model ./controller ./handler
qicycle@qicycledeMacBook-Pro-3 mage-erp % go test -cover -covermode=count --coverprofile=coverage.out ./model ./controller ./handler
? mage-erp/model [no test files]
ok mage-erp/controller 0.026s coverage: 2.0% of statements
ok mage-erp/handler 0.021s coverage: 3.1% of statements
可以看到输出了coverage百分比,我这个项目没啥测试代码,临时增加的。
4.覆盖率测试可视化分析
对刚才生成的coverage.out 进行可视化分析:
go tool cover -html=coverage.out
可以看到打开了一个网页:
左边可以选择对应的go文件,右边有列出来cover到的代码,绿色是cover的,红色是没有cover的
这样对项目跑一遍就知道覆盖率的多少了。
5.遇到的问题
5.1 如何对指定目录进行计算代码覆盖率
go test -cover -covermode=count --coverprofile=coverage.out ./model ./controller ./handler ./server ./lib
5.2 go tool cover --html=coverage.out只列出部分go文件
那是因为没有对应测试文件的go文件是不会列出来的