来源:http://blog.golang.org/cover
测试覆盖率
测试覆盖率是指当运行测试用例时,代码(类,包,模块)中有多少被执行到。覆盖率通常用百分比来表示。例如当我们说一个包的覆盖率是85%的时候,就是说测试用例让包中85%的代码都运行过了。Go语言中对于测试覆盖率有比较不错的支持,在1.2版本开始跟其他工具一起发布。
计算测试覆盖率的一种常见方法是在生成的二进制文件中放入一些“桩”。例如GNU的gcov会在目标程序的各个分支设置“断点”。 如果分支被执行到,那么对应的“断点”就被清除掉,这个分支也被标记成“已经覆盖”。
这个方法被广泛使用在多种语言的覆盖率工具中。甚至,在Go语言的一个早期测试覆盖工具中也是这么实现的。但是这种方法有问题。因为在二进制层次上分析程序的执行非常有挑战性,所以这种方法很难实现。
另外,追踪二进制执行并且映射到源代码,也不是一件简单的事情。
这种方法另外的一些问题,例如调试信息不精确,内联函数让二进制的分析更加复杂。更重要的一点是,这种方法不可移植。对于每一种计算机架构,(某种程度上)每一种操作系统来说,这种方法都需要重新实现,因为每种系统(硬件或软件)对于调试的支持都不尽相同。
如果你使用gccgo那么GNU gcov也能够给你提供测试覆盖信息。但是如果你使用Go编译器套装(compiler suite), 直到1.2版本你才有这个福气。