覆盖率技术基础
截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道:
- go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpoints。这就导致了当前go的测试覆盖率收集技术,一定是侵入式的,会修改目标程序源码。曾经有同学会问,插过桩的二进制能不能放到线上,所以建议最好不要。
- 到底什么是"插桩"?这个问题很关键。大家可以任意找一个go文件,试试命令
go tool cover -mode=count -var=CoverageVariableName xxxx.go
,看看输出的文件是什么?- 笔者以这个文件为例
https://github.com/qiniu/goc/blob/master/goc.go
, 得到以下结果:
- 笔者以这个文件为例
package main
import "github.com/qiniu/goc/cmd"
func main() {
CoverageVariableName.Count[0]++;
cmd.Execute()
}
var CoverageVariableName = struct {
Count [1]uint32
Pos [3 * 1]uint32
NumStmt [1]uint16
} {
Pos: [3 * 1]uint32{
21, 23, 0x2000d, // [0]
},
NumSt