方法局限
代码覆盖率的定义:对某一段代码或者代码的某一种属性做测试,其测试达到的程度被称为是覆盖率,比如对语句的覆盖,对分支或者条件的覆盖,等等。
计算方法:把现有的测试与可能执行的测试做比较,现有测试能够占总的可能执行的测试的多少比例。
覆盖率的经典定义没有考虑到一些情况,比如:
1. 输入特定的某个值或者某组值:边界值或者特殊的值;
2. 在编码中遗漏的代码:在代码中没有实现需求却要求的功能;
3. 中断,以及其他并行操作的情况。
Cem Kaner在他的著作“Software Negligence & Testing Coverage”里列举了101种这样的例子。
尽管覆盖率有一定的缺陷,但是还是需要量化的衡量维度(可扩充)。
工具调研
信息收集工具
市场上主要代码覆盖率工具:Emma、cobertura、jacoco、Clover(商用)。
覆盖粒度的具体意义?分支覆盖是指 if else的覆盖。
HUDSON:Java开发的一种持续集成工具。
具体见下表:
- | jacoco | emma | cobertura |
---|---|---|---|
原理 | 使用ASM修改字节码 | 修改jar文件,class文件字节码文件 | 基于jcoverage,基于asm框架对class文件插桩 |
覆盖粒度 | 行,类,方法,指令,分支 | 行,类,方法,基本块,指令,无分支覆盖 | 项目,包,类,方法的语句覆盖/分支覆盖 |
插桩 | on the fly、offline | on the fly、offline | offline,把统计代码插入编译好的class文件中 |
生成结果 | 在tomcat的catalina.sh配置javaangent参数,指出需要收集覆盖率的文件,shutdown时才收集,只能使用kill命令关闭tomcat,不要使用kill -9 | html,xml,txt,二进制格式报表 | html,xml |
缺点 | 需要源代码 | 1、需要debug版本,并打来build.xml中的debug编译项; 2、需要源代码,且必须与插桩的代码完全一致 | 1、不能捕获测试用例中未考虑的异常; 2、关闭服务器才能输出覆盖率信息(已有修改源代码的解决方案,定时输出结果;输出结果之前设置了hook,会与某些服务器的hook冲突,web测试中需要将cobertura.ser文件来回copy |
性能 | 快 | 小巧 | 插入的字节码信息更多 |
执行方式 | maven,ant,命令行 | 命令行 | maven,ant |
jenkins集成 | 生成html报告,直接与hudson集成,展示报告,无趋势图 | 无法与hudson集成 | 有集成的插件,美观的报告,有趋势图 |
报告实时性 | 默认关闭,可以动态从jvm dump出数据 | 可以不关闭服务器 | 默认是在关闭服务器时才写结果 |
维护状态 | 持续更新中 | 停止维护(2005 http://www.eclemma.org/jacoco /tru |