这是一个JavaProject,关于Cobertura的用法详见代码注释

首先是应用代码(即被测试的代码)

  1. package com.jadyer.service;
  2.  
  3. public class CalculatorService {
  4. public int add(int a, int b) {
  5. return a + b;
  6. }
  7.  
  8. public int minus(int a, int b) {
  9. return a - b;
  10. }
  11.  
  12. public int multiply(int a, int b) {
  13. return a * b;
  14. }
  15.  
  16. public int divide(int a, int b) {
  17. if (0 == b) {
  18. throw new IllegalArgumentException("非法参数:除数不能为零..");
  19. }
  20. return a / b;
  21. }
  22. }

下面是采用JUnit4.x编写的测试代码

  1. package com.jadyer.service;
  2.  
  3. import org.junit.Assert;
  4. import org.junit.Test;
  5.  
  6. /**
  7. * 使用Cobertura统计JUnit测试覆盖率
  8. * @see ----------------------------------------------------------------------------------------------------------
  9. * @see 生成测试覆盖率报告有三种方式(Maven--Ant--命令行)
  10. * @see Cobertura下载地址为http://sourceforge.net/projects/cobertura/files/
  11. * @see Cobertura结合Maven使用起来是极为方便的,详见http://blog.csdn.net/jadyer/article/details/7658734
  12. * @see Cobertura结合Ant生成报告也是非常方便的,详见本文下方给出的build.xml
  13. * @see 最麻烦的就是用命令行(不推荐)
  14. * @see ----------------------------------------------------------------------------------------------------------
  15. * @see 通过命令行生成报告
  16. * @see 0)先交待下工程的目录结构,src下存放应用代码,test下存放测试代码,bin下存放应用代码和测试代码的class文件
  17. * @see 1)解压cobertura-1.9.4.1-bin.zip到本地硬盘,并将D:\Develop\cobertura-1.9.4.1加入环境变量path
  18. * @see 2)将要测试的应用代码、编译之后的class文件和所需jar拷到一个单独的目录中
  19. * @see 拷贝完毕后的目录结构为D:\report\lib,D:\report\src,D:\report\bin(含所有的class文件)
  20. * @see 3)在命令提示行中使用命令为要生成测试覆盖率报告的代码生成一个ser文件
  21. * @see 这一步主要的目的是为需要生成报告的class文件加入Cobertura标记,用来告诉Cobertura哪些文件需要生成测试覆盖率报告
  22. * @see D:\report\bin>cobertura-instrument --destination instrumented com/jadyer/service
  23. * @see 4)基于ser文件运行测试
  24. * @see 这一步主要的目的是跑一便JUnit测试,并将测试结果加入到第三步所标记的相对应的class文件内,以便于下一步生成覆盖率报告
  25. * @see D:\report\bin>java -cp ../lib/junit-4.10.jar;../lib/cobertura.jar;instrumented;.;-Dnet.source
  26. * @see forge.cobertura.datafile=cobertura.ser org.junit.runner.JUnitCore com.jadyer.service.CalculatorServiceTest
  27. * @see 5)根据ser文件生成测试覆盖率报告
  28. * @see 这一步主要的目的是生成报告,同时关联第三步所标记的class文件的源码
  29. * @see D:\report\bin>cobertura-report --format html --datafile cobertura.ser --destination reports ../src
  30. * @see 这里面有两点需要注意一下
  31. * @see 1)如果测试代码的包名与应用代码的包名相同(事实上这很正常),那么通过以上5步所生成的报告中,会有一点无伤大雅的小问题
  32. * @see 那就是报告中即含有应用代码的测试覆盖率报告(它会按照实际覆盖率显示),也含有测试代码的测试覆盖率报告(它会显示100%)
  33. * @see 产生这一结果主要在于上面的第三步操作,由于包名相同故它会将测试代码的class也纳入报告标记的范围内
  34. * @see 我曾试过为它加入--excludeClasses参数,发现竟没有效果,可能我哪里没写对,不深究了,反正以后也没打算用命令行
  35. * @see 不过用本文提供的Ant脚本就不会出现这个问题了(Ant脚本中的<exclude name="/>是起作用的)
  36. * @see 2)若文件编码为UTF-8,则生成的报告中可能会乱码,此时只需为cobertura-report.bat增加-Dfile.encoding=UTF-8参数即可
  37. * @see 即为D:\Develop\cobertura-1.9.4.1\cobertura-report.bat文件里面的java命令加上此参数即可
  38. * @see ----------------------------------------------------------------------------------------------------------
  39. * @create Jul 6, 2013 6:18:16 PM
  40. * @author 玄玉<http://blog.csdn.net/jadyer>
  41. */
  42. public class CalculatorServiceTest {
  43. @Test
  44. public void myAdd() {
  45. int result = new CalculatorService().add(1, 2);
  46. Assert.assertEquals(3, result);
  47. }
  48.  
  49. @Test
  50. public void myMinus() {
  51. int result = new CalculatorService().minus(1, 2);
  52. Assert.assertEquals(-1, result);
  53. }
  54.  
  55. @Test
  56. public void myMultiply() {
  57. int result = new CalculatorService().multiply(2, 3);
  58. Assert.assertEquals(6, result);
  59. }
  60.  
  61. @Test
  62. public void myDivide() {
  63. int result = new CalculatorService().divide(6, 5);
  64. Assert.assertEquals(1, result);
  65. }
  66.  
  67. // @Test(expected = IllegalArgumentException.class)
  68. // public void myDivideException() {
  69. // new CalculatorService().divide(6, 0);
  70. // }
  71. }

下面附上我所使用的Ant脚本

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="cobertura.junit.report" default="coverage" basedir=".">
  3. <!-- 这是一个JavaProject,目录结构属很典型的,即src下存放应用代码,test下存放测试代码,bin下存放应用代码和测试代码的class文件 -->
  4. <property name="dir.lib" location="lib"/>
  5. <property name="dir.src" location="src"/>
  6. <property name="dir.test" location="test"/>
  7. <!-- 将生成测试覆盖率报告的有关文件都统一放到report目录下 -->
  8. <property name="dir.report" location="report"/>
  9. <!-- 将生成测试覆盖率报告时所生成的JUnit测试报告也统一放到report目录下 -->
  10. <property name="dir.report.junit" location="report/junit"/>
  11. <!-- 将生成测试覆盖率报告所需的应用代码和测试代码的class也统一放到report目录下 -->
  12. <property name="dir.report.class" location="report/class"/>
  13. <!-- 存放测试覆盖率报告结果的目录,最后浏览该目录下的index.html就能看到报告了 -->
  14. <property name="dir.report.result" location="report/result"/>
  15. <!-- 用于存放生成测试覆盖率报告时所需的被Cobertura标记过的应用代码class文件的目录 -->
  16. <property name="dir.report.instrument" location="report/instrument"/>
  17.  
  18. <!-- 指明下面<javac/>时需用到的jar包,这里最基本的需要用到下面6个jar -->
  19. <!-- junit-4.10.jar -->
  20. <!-- cobertura.jar(取自下载到的cobertura-1.9.4.1-bin.zip) -->
  21. <!-- asm-3.0(取自下载到的cobertura-1.9.4.1-bin.zip中的lib目录) -->
  22. <!-- asm-tree-3.0(取自下载到的cobertura-1.9.4.1-bin.zip中的lib目录) -->
  23. <!-- jakarta-oro-2.0.8(取自下载到的cobertura-1.9.4.1-bin.zip中的lib目录) -->
  24. <!-- log4j-1.2.9(取自下载到的cobertura-1.9.4.1-bin.zip中的lib目录) -->
  25. <path id="app.classpath">
  26. <fileset dir="${dir.lib}">
  27. <include name="*.jar"/>
  28. </fileset>
  29. </path>
  30.  
  31. <!-- 配置Cobatura ant扩展任务(其实这个tasks.properties是位于lib/cobertura.jar中的) -->
  32. <taskdef classpathref="app.classpath" resource="tasks.properties"/>
  33.  
  34. <target name="init">
  35. <delete dir="${dir.report}"/>
  36. <mkdir dir="${dir.report.junit}"/>
  37. <mkdir dir="${dir.report.class}"/>
  38. <mkdir dir="${dir.report.instrument}"/>
  39. </target>
  40.  
  41. <!-- 同时编译应用代码和测试代码 -->
  42. <target name="compile" depends="init">
  43. <javac srcdir="${dir.src}:${dir.test}" destdir="${dir.report.class}" debug="true" encoding="UTF-8">
  44. <classpath refid="app.classpath"/>
  45. </javac>
  46. </target>
  47.  
  48. <!-- 生成测试覆盖率报告(期间会进行JUnit测试) -->
  49. <target name="coverage" depends="compile">
  50. <cobertura-instrument todir="${dir.report.instrument}">
  51. <ignore regex="org.apache.log4j.*"/>
  52. <!-- 指定需要生成代码覆盖率报告的class -->
  53. <fileset dir="${dir.report.class}">
  54. <include name="**/**.class"/>
  55. <exclude name="**/*Test.class"/>
  56. </fileset>
  57. </cobertura-instrument>
  58. <!-- printsummary表示是否打印基本信息,haltonfailure表示测试失败是否中止,fork必须启用,可设置为"on,true,yes"等-->
  59. <junit printsummary="on" haltonerror="on" haltonfailure="on" fork="on">
  60. <!-- instrumented classes should be before the original (uninstrumented) classes -->
  61. <classpath location="${dir.report.instrument}"/>
  62. <classpath location="${dir.report.class}"/>
  63. <classpath refid="app.classpath"/>
  64. <!-- 同时运行多个测试用例,todir用来存放测试的输出结果,如果不指定<formatter/>是不会输出结果到todir中的 -->
  65. <formatter type="plain"/>
  66. <batchtest todir="${dir.report.junit}">
  67. <fileset dir="${dir.report.class}">
  68. <include name="**/*Test.class"/>
  69. </fileset>
  70. </batchtest>
  71. </junit>
  72. <!-- srcdir指定被测试的Java源码目录,destdir指定存放生成的报告的目录(默认就会生成html格式的报告) -->
  73. <cobertura-report srcdir="${dir.src}" destdir="${dir.report.result}"/>
  74. <!-- 最后将ser文件统一备份到报告目录中(默认的会在build.xml的同一目录下生成cobertura.ser) -->
  75. <move file="cobertura.ser" todir="${dir.report}"/>
  76. </target>
  77. </project>

最后把项目的目录结构和生成的测试覆盖率报告贴一下图(共4张)

生成报告前的目录结构如下

生成报告后的目录结构如下

生成的测试覆盖率报告首页截图

最后一张图片是查看测试覆盖率详情的截图

使用Cobertura统计JUnit测试覆盖率的更多相关文章

  1. 统计代码测试覆盖率-Python

    衡量Unit Test(单元测试)是否充分, 覆盖率是一个必要指标, 是检验单元测试的重要依据, 这里针对python unittest 的单元测试覆盖率coverage进行分享. 来自官方的解释: ...

  2. 由cobertura插件生成测试覆盖率报告

    由于cobertura已经集成到maven中,所以可以很方便的直接调用此插件生成报告: 直接运行命令:mvn cobertura:cobertura 就可以直接生成测试报告了. 下面是截图:

  3. spring && Cobertura && maven &&junit 单元测试以及测试覆盖率

    1. 目的:       junit 单元测试,Cobertura   测试覆盖率报告       项目目录结构          2. maven 配置     <project xmlns= ...

  4. 用 Cobertura 测量测试覆盖率

      尽管测试先行编程(test-first programming)和单元测试已不能算是新概念,但测试驱动的开发仍然是过去 10 年中最重要的编程创新.最好的一些编程人员在过去半个世纪中一直在使用这些 ...

  5. 白盒测试笔记之:Junit 单元测试以及测试覆盖率

    单元测试: 单元测试是从代码层面验证代码的正确性. 一般考虑接口中的数据结构是否正确,变量的临界条件,如空字符串,空集合等. ​ Junit入门  参考: Junit 入门教程: https://ww ...

  6. 统计 Django 项目的测试覆盖率

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 我们完成了对 blog 应用和 comment 应用这两个核心 app 的测试.现在 ...

  7. 测试覆盖率 之 Cobertura的使用

    什么是代码覆盖率? 代码覆盖率是对整个测试过程中被执行的代码的衡量,它能测量源代码中的哪些语句在测试中被执行,哪些语句尚未被执行. 为什么要测量代码覆盖率? 众所周知,测试可以提高软件版本的质量和可预 ...

  8. 测试覆盖率工具:EclEmma

    测试覆盖率工具:EclEmma 2016-08-26 目录 1 测试覆盖率实现技术2 EclEmma介绍3 EclEmma测试覆盖率指标4 EclEmma安装5 示例项目介绍  5.1 创建项目  5 ...

  9. Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)

    Maven单元测试 分类: maven 2012-05-09 15:17 1986人阅读 评论(1) 收藏 举报 maven测试junit单元测试javarandom   目录(?)[-] maven ...

随机推荐

  1. APP-随身听

    简单到复杂听你的专属音响界,听金融.听物业,听新闻和其他节目专辑,简要介绍了新的音频应用,给你不一样的聆听体验.还记得老歌做?这里有.您留声机的一部分!很简单的音频应用,随时随地与此应用程序来听你的私 ...

  2. 在 VS2013的ASPNET站点开发中用 xheditor v1.1.13 作为HTML编辑器

    要用vs2013开发一个博客站点,.net   framework  4,须要一个HTML编辑器作为写文章的工具.经多方试用,排除了dotnettextbox.kceditor.认为xheditor ...

  3. 【C++ Primer】拷贝控制

    十三.复制控制 1. 复制构造函数 类中的成员函数都默觉得inline类型.所以即使在类定义体内的函数声明显示定义为inline类型,在进行函数定义时也可以将inline进行省略. // 复制构造函数 ...

  4. testNg的安装与卸载

    1.testNG的安装 打开eclips,点击Help菜单.选择Install New Software. 在弹出的窗口的work with的输入框,输入http://beust.com/eclips ...

  5. leetcode[55] Merge Intervals

    题目:给定一连串的区间,要求输出不重叠的区间. Given a collection of intervals, merge all overlapping intervals. For exampl ...

  6. sql汉字转拼音

    /*创建取拼音首字母函数*/ create function [dbo].[fn_ChineseToSpell](@strChinese varchar(500)='') returns varcha ...

  7. linux下的中文编码问题

    很多linux的初学者都会碰到这样一个问题:把windows下的文档拷到linux系统,会出现乱码!其实这涉及到中文编码的问题.linux系统默认的是统一码(utf8).而如果你的文件是big5,显然 ...

  8. 【学习笔记】锋利的jQuery(四)AJAX

    一.load()方法 /* *如果没有参数传递,采用GET方式传递 *如果有参数,则自动转换成POST方式传递 *无论Ajax是否请求成功,请求完成后回调函数触发 */ load("test ...

  9. 浅谈DevExpress<二>:设计一个完整界面(2)

    下面来把剩下的工作做完,换肤功能昨天已近讨论过,今天就不重复了.首先建立三个全局变量,一个存放文件路径,一个存放数据,一个存放过滤条件. string DBFileName; DataView dat ...

  10. T4 Template Overview

    T4 Template Overview   T4 Template的组成 指令区:为模板转换引擎提供指令,控制模板如何被处理 Ÿ   template:模板相关的属性,debug是否可以调试:hos ...