如何让Cobertura / Emma在Eclipse应用程序中发挥出色?

时间:2009-03-17 20:52:22

标签: java eclipse cobertura headless emma

我的公司正在升级我们的构建系统以使用Buckminster(已经很顺利)。当然,如果我们能够自动生成他们用于代码的一些指标,管理者会喜欢它 - 其中一个指标是单元测试的覆盖范围。

以前的构建是基于PDE的,它产生了一个单独的无头应用程序,它解析了上下文中的所有插件,在其中查找测试类,将所有测试用例扔到更大的套件中,然后以编程方式运行它,通过JUnitResultFormatter.startTestSuite()。在此过程中,它为特定元数据(版权标记等)添加了一些本地测试,并对包依赖性进行了测试。

似乎我应该只能为测试应用程序导出产品,使用我选择的覆盖工具对其进行检测,然后运行它;然而,看起来两个覆盖工具都想知道他们正在处理的整个类路径。是否有可能使这些工具中的任何一个都能运行良好,而无需在整个构建工作区中搜索jar和依赖项?

1 个答案:

答案 0 :(得分:2)

在旧的SO问题的帮助下,管理一切工作。

我们从this post开始,它为我们提供了使用EMMA的示例覆盖设置。但是,似乎我们需要在我们想要获取覆盖数据的每个插件上强制依赖EMMA。

一些Google取证让我们进入this book excerpt,这相当充分地涵盖了OSGi类加载器层次结构。通过将osgi.parentClassloader=app行添加到测试运行应用程序的config.ini中,我们可以在命令行上指定类路径。该类路径需要包括:

  • Eclipse的startup.jar
  • 应用程序使用的Java SDK jar
  • 覆盖工具的罐子

当然,我们通过<java jar="foo.jar"> Ant任务运行测试,该任务默认忽略您提供的任何类路径信息并仅使用jar。在我们让Emma工作之后,我们切换到Cobertura,我们的最终Ant脚本(略有删节和匿名)看起来像:

<target name="generate.coverage" depends="buckminster.init">
  <!-- Generate the classpath. -->
  <path id="cobertura.classpath">
    <fileset dir="${tasks.dir}/lib/cobertura">
      <include name="cobertura.jar" />
      <include name="**/*.jar" />
    </fileset>
  </path>
  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

  <!-- Get ready to run the unit tests app, and delete old coverage data. -->
  <unzip src="${test-app.artifact}" dest="${output.dir}" overwrite="true" />
  <delete file="${output.dir}/cobertura.ser" />

  <!-- Instrument the jars in-place. Make sure to only capture what you want instrumented! -->
  <cobertura-instrument datafile="${output.dir}/cobertura.ser">
    <fileset dir="${output.dir}/test-app/plugins">
      <include name="**/*our.company_*.jar" />
    </fileset>
  </cobertura-instrument>

  <!-- Run the unit test application, by classname rather than by jar. -->
  <java fork="true" classname="org.eclipse.equinox.launcher.Main" logerror="true" failonerror="true" maxmemory="1G">
    <classpath>
      <pathelement location="${output.dir}/test-app/startup.jar" />
      <pathelement location="${tasks.dir}/lib/cobertura/cobertura.jar" />
      <fileset dir="${tasks.dir}/lib/cobertura">
        <include name="**/*.jar" />
      </fileset>
      <pathelement location="${java.class.path}" />
    </classpath>
    <sysproperty key="net.sourceforge.cobertura.datafile" file="${output.dir}/cobertura.ser" />            
    <arg value="-data" />
    <arg value="${output.dir}/test-app/workspace" />
    <arg value="--formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter:${log.dir}/test-results.xml" />
  </java>

  <!-- Generate the coverage reports. -->
  <cobertura-report format="html" datafile="${output.dir}/cobertura.ser" destdir="${output.dir}/cobertura-report">
    <fileset dir="${workspace.dir}/plugins">
      <include name="**/*.java" />
    </fileset>
  </cobertura-report>
</target>

希望这可以帮助那些与我们在同一地点的人。