只懂黑盒测试也能学会的代码覆盖率及精准化测试测试覆盖率是对测试完成程度的度量。它通常依据某种覆盖准则来对测试用例执行情况进行衡量,以判断测试执行得是否充分。
——出自《计算机科学技术名词 》第三版
今天文章中我们给大家介绍覆盖率统计及覆盖率分析。在10月13日20:00,资深测试开发架构师思寒将光临直播间手把手教大家如何搞定精准化测试!
温馨提示:你以为代码覆盖率与精准化测试知识与黑盒测试无缘?不,你只是没遇到思寒讲的这节课。
常见覆盖率统计工具
- emma
- cobertura
- jacoco
emma 与 cobertura 是为单元测试而设计的覆盖率统计,jacoco 与 emma 同属于一家公司,但是是为了更广泛的覆盖率统计而设计的工具。
Jacoco
jacoco 的文档中有个 mission 章节,里面对 jacoco
的定位描述的很好。原文的大意是说其他的工具没有得到积极有效的维护,而且其他的工具都是为了单一任务而设计,他们不是为了 “集成”
而生。从这一点上我们就可以看出 jacoco 的设计理念。
得益于 jacoco 的设计理念,以及良好的 api
设计,它可以轻松的与已有的工具集成,甚至进行平台化。它也可以同时用于单元测试与集成测试,所以是一款非常优秀的覆盖率统计工具,很多公司的精准化测试,就是重度依赖了
jacoco。
覆盖率分析原理
要了解代码覆盖率的统计原理,我们就需要去深入了解 jvm 的机制。这方面的知识是 java
领域的高端进阶知识,限于篇幅,我们只讲解下大概的原理,完整内容请参考 VM 虚拟机系列的书籍,以及 newrelic 早年发布的若干代码插桩的资料。
简单说下原理,java 源代码会被 javac 编译为 class 文件,class 文件保存了 class 的基本信息与 jvm 的指令集。java
的底层 runtime,也就是 jvm 在解析 class 的时候,会把文件格式的 class 读取到内存并运行。android
也是借鉴了这一整套的设计理念,android 上的 runtime 其实是 dalvik 与 art。
当我们要统计代码覆盖率的时候,就需要在代码的执行路径上加入探针分析。通常是在读取类的时候,在关键的指令块的出口与入口增加标记。当指令块被执行后,就会