用Cobertura在Maven命令行进行覆盖测试

Cobertura是一个基于jcoverage的免费Java工具,它能够显示哪一部分代码被你的测试所覆盖,并可生成HTML或XML报告. 它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码,还可以提供 API 实际操作的内部信息。
 
在工具的选择上我曾经也是犹豫过,emma看样子好像也是一个不错的选择,因为他对开发覆盖率细节方面的关注让我还是感觉比较贴心,但是emma生成的report确实有些让人不太舒服,感觉还是Cobertura的report更加完善些。最后还是选择了Cobertura。如果大家需要了解这两个工具各自的优势可以浏览以下主题:

--------------------------------------------------------------------------------
http://raibledesigns.com/rd/entry/emma_vs_cobertura_for_code
http://kwakil.blogspot.com/2006/07/cobertura-vs-emma.html
--------------------------------------------------------------------------------
尽管emma在maven中生成的报表没有Cobertura好看,但是有一个基于emma的Eclipse插件却是相当棒的一个工具,这个工具可以帮助开发人员对测试用例有针对性的关注代码的覆盖率。为了保证本专题的完整性,我打算再开一个专题专门说明emma的Eclipse插件的使用。
要想在Maven2中使用Cobertura生成单元测试报告,首先需要做的就是更新你的Maven2版本,我以前用的是version2.0.4,Cobertura好像并未对该版本的Maven2提供支持,而且官方也没有明确说明plugin只支持到了version2.0.6,最后熬了好多天,我的同事才发现原来是版本的问题。最后我将我的Maven2版本升级到version2.0.6,执行了一下site命令,呵呵呵呵,期待已久的cobertura目录终于出现了。
其实Cobertura的官方Maven Plugin是有bug的,你可以在Maven的官方网站上找到相关信息:
http://jira.codehaus.org/browse/MCOBERTURA-61
所以我们现在虽然down下来了Cobertura的Maven Plugin,但是还是没法生成正确的Coverage Reporting,后来同事在网上发现了一个修正了官方bug的Maven Plugin,做法是直接下载到本地,然后手动在Maven2仓库中覆盖掉从官方下载下来的jar文件。
如果你用的是JDK5可以从下面的网址下载:
http://www.artofsolving.com/files/m2/cobertura-1.8.jar
如果你用的是JDK1.4那就从下面的网站下载:
http://dist.codehaus.org/mule/dependencies/maven2/cobertura/cobertura/1.8/cobertura-1.8.jar
下面是Cobertura Plugin提供的一些goal,帖出来方便查阅:
--------------------------------------------------------------------------------
Goal                            Description
cobertura:check            Check the Last Instrumentation Results.
cobertura:clean            Clean up rogue files that cobertura maven plugin is tracking.
cobertura:dump-datafile    Cobertura Datafile Dump Mojo
cobertura:instrument       Instrument the compiled classes.
cobertura:cobertura        Instruments, Tests, and Generates a Cobertura Report.
--------------------------------------------------------------------------------
说了半天,还没有说到如何在Maven2中进行配置,由于Maven官方提供的Cobertura插件只支持标准的测试发布路径(有些喜欢将测试类和工程类编译到同一个路径下,但是Maven官方推荐的路径确实将测试类和工程类分开编译到不同的路径下),那首先需要修改编译路径,如果在你的Project POM中没有对编译路径、资源路径做过任何声明,那Maven就会默认取标准路径,如果你的工程真的没有设置这些信息,那么,你很幸运,可以跳过此步。但是如果你的路径不是标准路径,请按以下方式进行修改:

xml 代码
  1. <sourceDirectory>src/main/java</sourceDirectory>  
  2. <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>  
  3. <testSourceDirectory>src/test/java</testSourceDirectory>  
  4. <outputDirectory>target/classes</outputDirectory>  
  5. <testOutputDirectory>target/test-classes</testOutputDirectory>  


通常情况下我们只需要进行如下配置就足可以应付当前的测试需求了:

xml 代码
  1. <reporting>  
  2.  <outputDirectory>target/site</outputDirectory>  
  3.  <plugins>  
  4.   <plugin>  
  5.    <groupId>org.codehaus.mojo</groupId>  
  6.    <artifactId>cobertura-maven-plugin</artifactId>  
  7.   </plugin>  
  8.  </plugins>  
  9. </reporting>  


当QA拿到test case运行的coverage reporting 时,通常希望能够进行打包以和开发人员取得联系,本人目前尚未找到合适的Maven打包方法,由于在Maven2中支持执行Ant脚本,因此我在这里为build节点中的plugins节点提供了一个用ant脚本写的plugin,在Maven命令行通过执行site命令便可以将最后的测试报告(包括测试代码覆盖率和测试用例的运行情况reports)进行打包

xml 代码
  1. <plugin>  
  2.  <artifactId>maven-antrun-plugin</artifactId>  
  3.  <executions>  
  4.   <execution>  
  5.    <phase>site</phase>  
  6.    <configuration>  
  7.     <tasks>  
  8.      <copy todir="target/classes">  
  9.       <fileset dir="src/main/java">  
  10.        <include name="**/*.java" />  
  11.       </fileset>  
  12.      </copy>  
  13.      <jar destfile="target/cover-test-result.zip">  
  14.       <fileset dir="target/site">  
  15.        <include name="**/*.html" />  
  16.        <include name="**/*.css" />  
  17.        <include name="**/*.txt" />  
  18.        <include name="**/*.png" />  
  19.        <include name="**/*.js" />  
  20.       </fileset>  
  21.      </jar>  
  22.     </tasks>  
  23.    </configuration>  
  24.    <goals>  
  25.     <goal>run</goal>  
  26.    </goals>  
  27.   </execution>  
  28.  </executions>  
  29. </plugin>  


继续说Cobertura的附加配置:
通过上面的配置,我们已经可以对一个工程进行代码覆盖率测试了,但是Cobertura在你没有声明test case不用分析覆盖率的情况下,他会连同test case一起分析覆盖率,尽管这样不会影响我们整个工程的代码覆盖率,但是在生成的报告中多出一个testcase来,总让人感觉不是很舒服,因此,你可以采用Cobertura的一些附加配置来限制那些不用进行覆盖率测试的类,具体做法如下:

xml 代码
  1. <plugin>  
  2.  <groupId>org.codehaus.mojo</groupId>  
  3.  <artifactId>cobertura-maven-plugin</artifactId>  
  4.  <configuration>  
  5.   <instrumentation>  
  6.    <!--<ignore>.*</ignore>  
  7.    -->  
  8.    <excludes>  
  9.     <exclude>**/*Test.class</exclude>  
  10.    </excludes>  
  11.   </instrumentation>  
  12.  </configuration>  
  13.  <executions>  
  14.   <execution>  
  15.    <goals>  
  16.     <goal>clean</goal>  
  17.    </goals>  
  18.   </execution>  
  19.  </executions>  
  20. </plugin>  


将上面这段代码加入到build节点的plugins节点中。执行site命令,看看是不是已经没有test case的代码覆盖率report了?呵呵呵呵。
结束!!!!

你可能感兴趣的:(eclipse,maven,xml,ant,单元测试)