"聊点干货"html

覆盖率技术基础

截止到Go1.15.2之前,关于覆盖率技术底层实现,如下知识点您应该知道:git

 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]
  },
  NumStmt: [1]uint16{
   1, // 0
  },
 }
CoverageVariableName
CountCoverageVariableNameCoverageVariableName.Count[0]++github.com/qiniu/goc/goc.go:21.13,23.2 1 1CoverageVariableNamePos21230x2000dNumStmt

依托于go语言官方强大的工具链,你们能够很是方便的作单测覆盖率收集与统计。可是集测/E2E就不是那么方便了。不过好在咱们如今有了 https://github.com/qiniu/goc。

集测覆盖率收集利器 - Goc原理

go test -cover_testmain.gogocgo test -c -cover
goc servergoc profile

总体架构参见:

代码覆盖率的最佳实践

技术须要为企业价值服务,否则就是在耍流氓。能够看到,目前玩覆盖率的,主要有如下几个方向:

  • 度量 - 深度度量,各类包,文件,方法度量,都属于该体系。其背后的价值在于反馈与发现。反馈测试水平如何,发现不足或风险并予以提升。好比常见的做为流水线准入标准,发布门禁等等。度量是基础,但不能止步于数据。覆盖率的终极目标,是提升测试覆盖率,尤为是自动化场景的覆盖率,并一以贯之。因此基于此,业界咱们看到,作的比较有价值的落地形态是增量覆盖率的度量。goc diff 结合Prow平台也落地了相似的能力,若是您内部也使用Kubernetes,不妨尝试一下。固然同类型的比较知名的商业化服务,也有CodeCov/Coveralls等,不过目前她们多数是局限在单测领域。

  • 精准测试方向 - 这是个很大的方向,其背后的价值逻辑比较清晰,就是创建业务到代码的双向反馈,用于提高测试行为的精准高效。但这里其实含有悖论,懂代码的同窗,大几率不须要无脑反馈;不能深刻到代码的同窗,你给代码级别的反馈,也效果不大。因此这里落地姿式很重要。目前业界没还看到有比较好的实践例子,大部分都是解决特定场景下的问题,有必定的局限。

而相较于落地方向,做为广大研发同窗,下面这些最佳实践可能对您更有价值:

  • 高代码覆盖率并不能保证高产品质量,但低代码覆盖率必定说明大部分逻辑没有被自动化测到。后者一般会增长问题遗留到线上的风险,当引发注意。

  • 没有普适的针对全部产品的严格覆盖率标准。实际上这更应该是业务或技术负责人基于本身的领域知识,代码模块的重要程度,修改频率等等因素,自行在团队中肯定标准,并推进成为团队共识。

  • 低代码覆盖率并不可怕,可以主动去分析未被覆盖到的部分,并评估风险是否可接受,会更加有意义。实际上笔者认为,只要这一次的提交比上一次要好,都是值得鼓励的。

谷歌有篇博客(见参考资料)提到,其经验代表,重视代码覆盖率的团队一般会更加容易培养卓越工程师文化,由于这些团队在设计产品之初就会考虑可测性问题,以便能更轻松的实现测试目标。而这些措施反过来会促使工程师编写更高质量的代码,更注重模块化。

最后,欢迎点击左下角详情按钮,加入七牛云Goc交流群,咱们一块儿聊聊goc,聊聊研发效能那些事。

参考资料:

  • https://testing.googleblog.com/2020/08/code-coverage-best-practices.html

END

系列文章

以为不错,欢迎关注公众号: 大卡尔