1. Introduction
代码覆盖(code coverage):为了全面地覆盖测试,必须测试程序的状态以及程序流程,设法进入和退出每一个模块,执行每一行代码,进入软件每一条逻辑和决策分支。——[Software Testing]
Code coverage is An information on what source code is exercised in execution.——Alexandre Iline
其要求通过完全访问代码以查看运行测试用例时经过了哪些部分。
- 语句覆盖(statement coverage)
这是代码覆盖最直接的表现形式,进行语句覆盖目的是保证程序中每一条语句至少执行一次。
分支覆盖(branch coverage)
试图覆盖软件中所有的路径称为路径覆盖,路径覆盖中最简单的形式则是分支覆盖。但是语句100%覆盖不等于分支100%
方法覆盖(method coverage)
软件中方法被测试执行的情况
2. Tools
Java代码覆盖工具有两类:第一种添加语句到源码并要求重新编译;第二种是在执行中或执行前修改(instrument)字节码。
2.1 JCov
JCov是Java开始之初由Sun JDk(更早之前是Oracle JDK)开发和使用的。从1.1版本开始,Jcov就可以对Java代码覆盖进行测试和报告。2014年开始作为OpenJDK codetools项目的一部分开始开放源码。其主页https://wiki.openjdk.java.net/display/CodeTools/jcov。
2.1.1 JCov for Ant
项目结构:
lib folder:相关的jar
src folder:业务代码
test folder:测试代码
主要在Command line上运行ant(当然,Eclipse也是可以的),build.xml配置步骤如下(大多工具步骤也是如此):
- 编译业务代码以及测试代码
<javac encoding="iso-8859-1" debug="true" target="1.5" source="1.5"
srcdir="src"
destdir="classes">
</javac>
- 在业务代码class文件中插入instrumentation。
<instrument productdir="classes" destdir="instr_classes" outtemplate="template.xml">
<!-- 需要的jar-->
<implantTo path="." implantRT="lib/jcov.network.saver.jar"/>
</instrument>
- 打开Jcov的grabber,再次运行测试代码的class文件(以此收集覆盖信息),关闭grabber,最后打印报告(指定地址以及各式)
<!--start grabber-->
<grabber output="result.xml" template="template.xml"/>
<!--运行测试用例字节码(此时运行,测试用例调用的是被插入instrutation的业务class文件)-->
<java classname="HelloTest" fork="true" failonerror="true">
<classpath>
<pathelement location="lib/jcov.network.saver.jar"/>
<pathelement location="test_classes"/>
<pathelement location="instr_classes"/>
</classpath>
</java>
<!--stop grabber-->
<!-- 生成报告-->
<grabber-manager command="kill"/>
<report output="report" jcovfile="result.xml"/>
报告:
2.2 JaCoCo
JaCoco是开放源码的工具包,作为EMMA的替代品被开发出来(同一个开发团队)。项目主页