使用Cobertura 1.9.2测试代码时,覆盖率为零,但测试仍在工作。

3

我运行代码覆盖率目标:

<junit fork="yes" dir="${basedir}" failureProperty="test.failed">
        <!--
                        Note the classpath order: instrumented classes are before the
                        original (uninstrumented) classes.  This is important.
                -->
        <classpath path="${instrumented.dir}" />
        <classpath path="${classes.dir}" />
        <classpath refid="classpath" />
        <!--
                        The instrumented classes reference classes used by the
                        Cobertura runtime, so Cobertura and its dependencies
                        must be on your classpath.
                -->
        <classpath refid="cobertura.classpath" />

        <formatter type="xml" />
        <!--<test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />-->
        <batchtest fork="yes" todir="${reports.xml.dir}">
                <fileset dir="${classes.dir}">
                        <include name="**/generated/AllTests.class" />
                </fileset>
        </batchtest>
</junit>

<junitreport todir="${reports.xml.dir}">
        <fileset dir="${reports.xml.dir}">
                <include name="TEST-*.xml" />
        </fileset>
        <report format="frames" todir="${reports.html.dir}" />
</junitreport>

当使用fork="true"时,我会得到以下输出:
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at net.sourceforge.cobertura.util.FileLocker.lock(FileLocker.java:124)
        at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectData(ProjectData.java:331)
        at net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:31)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.io.IOException: No locks available
        at sun.nio.ch.FileChannelImpl.lock0(Native Method)
        at sun.nio.ch.FileChannelImpl.lock(FileChannelImpl.java:784)
        at java.nio.channels.FileChannel.lock(FileChannel.java:865)
        ... 8 more
---------------------------------------
Unable to get lock on /vobs/rnc/rrt/roam2/roamSs/RoamMao_swb/RoamMao_bldu/ant_build/cobertura.ser.lock: null
This is known to happen on Linux kernel 2.6.20.
Make sure cobertura.jar is in the root classpath of the jvm 
process running the instrumented code.  If the instrumented code 
is running in a web server, this means cobertura.jar should be in 
the web server's lib directory.
Don't put multiple copies of cobertura.jar in different WEB-INF/lib directories.
Only one classloader should load cobertura.  It should be the root classloader.

我正在使用Ant 1.7.0和cobertura 1.9.2。

为什么没有覆盖率?测试在我的目标中运行正常。 我尝试切换Java版本(1.5.0_06和1.6.0_10),但没有任何区别。

2个回答

5
我在设置环境属性 cobertura.use.java.nio=false 上取得了成功。
由于我使用的是ant,所以我只需编辑cobertura-build.xml文件,在<junit>命令中添加以下内容:
<junit fork="yes">
  <jvmarg value="-Dcobertura.use.java.nio=false"/>
  ...
</junit>

将cobertura.use.java.nio=false设置为false也解决了我的问题。 - Caroline Orr

0

您的 Cobertura 在构建过程中崩溃了。

您可以尝试将 Cobertura 升级到版本 1.9.3 或 1.9.4.1。不过,我在使用 1.9.4.1 时遇到了一些问题,目前我正在使用 1.9.3。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接