测试与代码分属不同包时Go测试无覆盖率问题求助
解决Go独立目录集成测试无法生成覆盖率的问题
我来帮你搞定这个问题~ 你遇到的情况是因为Go的go test默认只统计测试所在包的代码覆盖率,而你的集成测试在itest包,被测逻辑在hello包,所以直接跑测试不会把hello包的覆盖情况算进去。下面是具体的解决方法:
方法一:使用-coverpkg指定要统计的包
在项目根目录(也就是$GOPATH/src/go-test)下执行以下命令:
- 生成覆盖率数据文件:
go test -coverpkg=./hello ./itest -coverprofile=coverage.out
-coverpkg=./hello:告诉Go要统计hello包的代码覆盖率,不管测试代码在哪个包./itest:指定要运行的测试所在目录-coverprofile=coverage.out:把覆盖率数据输出到coverage.out文件中
- 生成可视化的HTML覆盖率报告:
go tool cover -html=coverage.out
执行完这个命令后,会自动打开浏览器展示覆盖率报告,你就能看到hello包的Hello函数被测试覆盖的情况了。
如果你的项目有多个被测包,可以用-coverpkg=./...来一次性指定所有子包:
go test -coverpkg=./... ./itest -coverprofile=coverage.out
方法二:用Makefile简化命令(可选)
如果经常需要跑覆盖率测试,可以写个Makefile来简化操作,在项目根目录创建Makefile:
.PHONY: test-coverage test-coverage: go test -coverpkg=./hello ./itest -coverprofile=coverage.out go tool cover -html=coverage.out -o coverage.html
之后只需要运行make test-coverage,就能自动生成覆盖率数据和HTML报告(会保存在coverage.html文件里)。
注意事项
- 一定要在项目根目录下执行命令,不然包路径可能会识别错误
- 如果你的集成测试启动了HTTP服务器(比如用
httptest),只要服务器和测试在同一个进程里,这种方法同样适用,覆盖率会正常统计到服务器逻辑的代码
内容的提问来源于stack exchange,提问作者Peter Dotchev
相关产品推荐
相关产品推荐

