代码之家  ›  专栏  ›  技术社区  ›  Art Doler

我如何才能让cobertura/emma在Eclipse应用程序中发挥好作用?

  •  1
  • Art Doler  · 技术社区  · 17 年前

    我的公司正在升级我们的建筑系统,以使用巴克明斯特(已经进展顺利)。当然,如果我们能够在代码中自动生成一些用于代码的度量标准,那么经理们会希望这样做——其中一个度量标准是单元测试的覆盖范围。

    上一个构建基于PDE,产生了一个单独的无头应用程序,该应用程序通过上下文中的所有插件进行解析,在插件内部查找测试类,将所有测试用例放入一个更大的套件中,然后通过 JUnitResultFormatter.startTestSuite() . 在这个过程中,它添加了一些针对特定元数据的本地测试(版权标记等)和针对包依赖性的测试。

    似乎我应该能够为测试应用程序导出产品,使用我选择的覆盖工具对其进行检测,然后运行它;但是,看起来这两个覆盖工具都想知道他们正在处理的整个类路径。是否可以在不拖网我整个构建工作区的jar和依赖项的情况下,让这些工具中的任何一个发挥作用?

    1 回复  |  直到 17 年前
        1
  •  2
  •   Art Doler    17 年前

    在一个老问题的帮助下,设法使一切正常运转。

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

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

    • 伊柯丽斯 startup.jar
    • 应用程序使用的JAVA SDK JAR
    • 覆盖工具的罐子

    当然,我们是通过 <java jar="foo.jar"> Ant任务,它会自动忽略您提供的任何类路径信息,只使用jar。在让艾玛工作之后,我们换上了科贝图拉,我们最后的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>
    

    希望这能帮助那些和我们在同一地点的人。

    推荐文章