覆盖率测试工具cobertura 2.1.1
分享到:
cobertura是一个给予就coverage的开源免费java工具,用于计算测试访问的代码的百分比,他可以用于识别用户的java程序的哪些部分缺乏测试覆盖,是非常强大的工具。
你可以通过cobertura检测基本代码,并观察测试包运行时执行了那些代码和没有执行哪些代码,通过这些代码用户就可以进行测量测试覆盖率了。除了找出未测试到的代码和发现BUG以外,我们的这可U安工具还可以通过标记无用的、执行不到的代码来为用户提供优化代码的服务,还能够通过API接口来进行操作java应用程序内部的信息。如果你需要一款覆盖率测试工具,这款cobertura是相当不错的选择。
捕获不会发生的异常的 catch 语句,比如在从 ByteArrayInputStream 进行读取操作时抛出的 IOException。
非公共类中的一些方法,它们永远也不会被实际调用,只是为了满足某个接口契约而必须实现。
处理虚拟机 bug 的代码块,比如说,不能识别 UTF-8 编码。
利用 Cobertura 报告,可以找出代码中未测试的部分并针对它们编写测试。例如,图 3 显示 Jaxen 需要进行一些测试,运用 name() 函数对文字节点、注释节点、处理指令节点、属性节点和名称空间节点进行测试。
(几乎)不留下任何未测试的代码
是否有一些可以测试但不应测试的内容?这取决于您问的是谁。在 JUnit FAQ 中,J. B. Rainsberger 写到“一般的看法是:如果 自身 不会出问题,那么它会因为太简单而不会出问题。第一个例子是 getX() 方法。假定 getX() 方法只提供某一实例变量的值。在这种情况下,除非编译器或者解释器出了问题,否则 getX() 是不会出问题的。因此,不用测试 getX(),测试它不会带来任何好处。对于 setX() 方法来说也是如此,不过,如果 setX() 方法确实要进行任何参数验证,或者说确实有副作用,那么还是有必要对其进行测试。”
阅读 Cobertura 输出
我们首先查看生成的 Cobertura 输出。图 1 显示了对 Jaxen 测试包运行 Cobertura 生成的报告。从该报告中,可以看到从很好(在 org.jaxen.expr.iter 包中几乎是 100%)到极差(在 org.jaxen.dom.html 中完全没有覆盖)的覆盖率结果。
图 1. Jaxen 的包级别覆盖率统计数据
Cobertura 通过被测试的行数和被测试的分支数来计算覆盖率。第一次测试时,两种测试方法之间的差别并不是很重要。Cobertura 还为类计算平均 McCabe 复杂度。
可以深入挖掘 HTML 报告,了解特定包或者类的覆盖率。图 2 显示了 org.jaxen.function 包的覆盖率统计。在这个包中,覆盖率的范围从 SumFunction 类的 100% 到 IdFunction 类的仅为 5%。
图 2. org.jaxen.function 包中的代码覆盖率
进一步深入到单独的类中,具体查看哪一行代码没有测试到。图 3 显示了 NameFunction 类中的部分覆盖率。最左边一栏显示行号。后一栏显示了执行测试时这一行被执行的次数。可以看出,第 112 行被执行了 100 次,第 114 行被执行了 28 次。用红色突出显示的那些行则根本没有测试到。这个报告表明,虽然从总体上说该方法被测试到了,但实际上还有许多分支没有测试到。
图 3. NameFunction 类中的代码覆盖率
后来在同事的帮助下,网上也查了一下,说要把jar包放在lib目录下,于是把cobertura.jar拷到tomcatcommonlib目录下,见下图:
再次启动tomcat,成功~
对于用command line方式来使用cobertura,现总结如下:
1.拷贝cobertura.jar到tomcatcommonlib目录下;
2.对于需要统计覆盖率的class文件进行instrument,命令行格式如下:
cobertura-instrument.bat [--basedir dir] [--datafile file] [--destination dir] [--ignore regex] classes [...]
[]内的参数可省略,我destination等参数都没用,直接对要进行instrument的class操作,我的命令行如下:
3.instrument成功后会在cobertura的目录下生成cobertura.ser文件,将此文件拷到tomcatbin目录下,见下图:
4.启动tomcat。在命令提示符窗口,转到tomcatbin目录,键入startup.bat并回车;
5.启动成功后,tomcatbin目录下的cobertura.ser的文件时间会更新;
6.和平常一样测试,测试结束后,关闭tomcat。在命令提示符窗口键入shutdown.bat并回车,然后Ctrl+C来关闭tomcat窗口,这样cobertura.ser才会更新,见下图:
一般每次测试并关闭tomcat后,cobertura.ser都是在原来的基础上更新,所以一般不用merge命令:)
7.生成report,命令行格式如下:
cobertura-report.bat [--datafile file] [--destination dir] [--format (html|xml)] [--encoding encoding] source code directory [...] [--basedir dir file underneath basedir ...]
默认是html格式,会生成好多html文件,见下图:
上图中没有指明source code directory,在查看report时,会显示没有和源代码关联,因此需指定源代码所在的目录,如下图:
8.打开index.html文件,查看覆盖率,如下图:
你可以通过cobertura检测基本代码,并观察测试包运行时执行了那些代码和没有执行哪些代码,通过这些代码用户就可以进行测量测试覆盖率了。除了找出未测试到的代码和发现BUG以外,我们的这可U安工具还可以通过标记无用的、执行不到的代码来为用户提供优化代码的服务,还能够通过API接口来进行操作java应用程序内部的信息。如果你需要一款覆盖率测试工具,这款cobertura是相当不错的选择。
cobertura软件特色
只在特定平台上执行的代码。例如,在一个设计良好的 GUI 应用程序中,添加一个 Exit 菜单项的代码可以在 Windows PC 上运行,但它不能在 Mac 机上运行。捕获不会发生的异常的 catch 语句,比如在从 ByteArrayInputStream 进行读取操作时抛出的 IOException。
非公共类中的一些方法,它们永远也不会被实际调用,只是为了满足某个接口契约而必须实现。
处理虚拟机 bug 的代码块,比如说,不能识别 UTF-8 编码。
cobertura软件功能
确认遗漏的测试利用 Cobertura 报告,可以找出代码中未测试的部分并针对它们编写测试。例如,图 3 显示 Jaxen 需要进行一些测试,运用 name() 函数对文字节点、注释节点、处理指令节点、属性节点和名称空间节点进行测试。
(几乎)不留下任何未测试的代码
是否有一些可以测试但不应测试的内容?这取决于您问的是谁。在 JUnit FAQ 中,J. B. Rainsberger 写到“一般的看法是:如果 自身 不会出问题,那么它会因为太简单而不会出问题。第一个例子是 getX() 方法。假定 getX() 方法只提供某一实例变量的值。在这种情况下,除非编译器或者解释器出了问题,否则 getX() 是不会出问题的。因此,不用测试 getX(),测试它不会带来任何好处。对于 setX() 方法来说也是如此,不过,如果 setX() 方法确实要进行任何参数验证,或者说确实有副作用,那么还是有必要对其进行测试。”
阅读 Cobertura 输出
我们首先查看生成的 Cobertura 输出。图 1 显示了对 Jaxen 测试包运行 Cobertura 生成的报告。从该报告中,可以看到从很好(在 org.jaxen.expr.iter 包中几乎是 100%)到极差(在 org.jaxen.dom.html 中完全没有覆盖)的覆盖率结果。
图 1. Jaxen 的包级别覆盖率统计数据
Cobertura 通过被测试的行数和被测试的分支数来计算覆盖率。第一次测试时,两种测试方法之间的差别并不是很重要。Cobertura 还为类计算平均 McCabe 复杂度。
可以深入挖掘 HTML 报告,了解特定包或者类的覆盖率。图 2 显示了 org.jaxen.function 包的覆盖率统计。在这个包中,覆盖率的范围从 SumFunction 类的 100% 到 IdFunction 类的仅为 5%。
图 2. org.jaxen.function 包中的代码覆盖率
进一步深入到单独的类中,具体查看哪一行代码没有测试到。图 3 显示了 NameFunction 类中的部分覆盖率。最左边一栏显示行号。后一栏显示了执行测试时这一行被执行的次数。可以看出,第 112 行被执行了 100 次,第 114 行被执行了 28 次。用红色突出显示的那些行则根本没有测试到。这个报告表明,虽然从总体上说该方法被测试到了,但实际上还有许多分支没有测试到。
图 3. NameFunction 类中的代码覆盖率
命令行方式使用cobertura
比较喜欢用command line方式,因为这样省去了用ant task方式写xml的麻烦。前几次在执行了cobertura-instrument.bat之后,根据网上说的把cobertura.jar和cobertura.ser拷到tomcat的bin目录下,启动tomcat就会报错,见下图:后来在同事的帮助下,网上也查了一下,说要把jar包放在lib目录下,于是把cobertura.jar拷到tomcatcommonlib目录下,见下图:
再次启动tomcat,成功~
对于用command line方式来使用cobertura,现总结如下:
1.拷贝cobertura.jar到tomcatcommonlib目录下;
2.对于需要统计覆盖率的class文件进行instrument,命令行格式如下:
cobertura-instrument.bat [--basedir dir] [--datafile file] [--destination dir] [--ignore regex] classes [...]
[]内的参数可省略,我destination等参数都没用,直接对要进行instrument的class操作,我的命令行如下:
3.instrument成功后会在cobertura的目录下生成cobertura.ser文件,将此文件拷到tomcatbin目录下,见下图:
4.启动tomcat。在命令提示符窗口,转到tomcatbin目录,键入startup.bat并回车;
5.启动成功后,tomcatbin目录下的cobertura.ser的文件时间会更新;
6.和平常一样测试,测试结束后,关闭tomcat。在命令提示符窗口键入shutdown.bat并回车,然后Ctrl+C来关闭tomcat窗口,这样cobertura.ser才会更新,见下图:
一般每次测试并关闭tomcat后,cobertura.ser都是在原来的基础上更新,所以一般不用merge命令:)
7.生成report,命令行格式如下:
cobertura-report.bat [--datafile file] [--destination dir] [--format (html|xml)] [--encoding encoding] source code directory [...] [--basedir dir file underneath basedir ...]
默认是html格式,会生成好多html文件,见下图:
上图中没有指明source code directory,在查看report时,会显示没有和源代码关联,因此需指定源代码所在的目录,如下图:
8.打开index.html文件,查看覆盖率,如下图:
展开更多
覆盖率测试工具cobertura 2.1.1下载地址
- 需先下载高速下载器:
- 专用下载:
- 其它下载: