Function Test Code Coverage方案(Draft)
测试覆盖率,简单的说就是衡量测试活动覆盖产品代码的指标。测试的目的,是为了验证产品代码按照预期的目的执行,也可以被看做代码功能的文档说明。进一步的分析,测试覆盖率间接的衡量产品的质量,因为它只是衡量了测试代码的质量,而不是产品代码(当然,测试代码也应该包含在产品代码里,这里说的产品代码,不包含测试代码)。
l Statement coverage(line coverage)
用于评测产品代码独立代码行在测试活动中执行的行覆盖率,Statement coverage
的优点是简单,缺点是无法包含逻辑分支,所以,无法全面的衡量测试代码的质量。
l Basic block coverage
把非分支的代码区域做为一个计量单位.用于一个if/else中的某个分支行数远大于另 一个分支。所以可能会出现这项指标比较高的情况。
l Decision coverage(branch coverage)
用于评价代码分支地测试覆盖率。
l Path coverage
用于评测产品代码在测试活动中从开始到结束所有可能执行路径的覆盖率。
l Function coverage(Method Function)
评测产品代码在测试活动中执行方法的覆盖率。
对于大多数情况,关注这些指标就可以了。
1.3 测试覆盖率的实现方式
l Instrumentation (offline mode)
可以认为是测试工具enhance产品代码的一种方式,将一些统计的代码动态的增加到
产品代码里,又可以分为Enhance Class文件和Enhance code resource文件。大多数Code coverage工具会在编译期增强Class文件。
l Custom JVM (on-the-fly mode)
可以认为测试工具在runtime时将Instrumentation和测试活动合二为一。
比较方便,适用于简单的测试。不适合在应用服务器环境下的测试(应用服务器会使用自己的ClassLoader)。
l Emma支持以offline 和 on the fly 二种模式来 instrumentation *.class文件。
l 支持四种测试覆盖率衡量指标,Class, Method(Function), line, basic block。
l 支持以多种报表格式的输出。包括 Plain text, HTML, XML,报表的样式都是可配置的。
l 不同的Coverage data可以相互整合。
l 支持*.class 和 *.jar的Instrumentation。
l 整合Ant任务。
l 100%的纯java实现,支持Java 1.2或更高版本的JVM,不依赖于任何第三方类库。
1.5 统计Function Test Code coverage 测试覆盖率流程
1. 在Daily build的版本中加上Emma instrumentation的Task,enhance工程代码,确保生成的coverage.em文件在正确的目录下。
2. 配置emmaweb(这是一个以单独的WAR包形式发布的code coverage生成平台),修改web.xml,将emmaDirectory指向生成coverage.em的目录。
3. 运行 http://host:port/emmaweb/servlet/DumpCoverageDataServlet 以生成runtime的coverage data。这一步在每次希望重新生成最新的coverage report时必须执行。
4. 运行 http://host:port/emmaweb/servlet/GenReportServlet 生成最新的report报表。
5. 执行 http://host:port/emmaweb/emma/report/ 查看测试覆盖率报表。
---from jjyao's blog