arquillian jboss as7托管和jacoco - jacoco.exec文件为空

时间:2013-07-28 11:46:17

标签: java jboss jboss-arquillian jacoco

我有一个项目在jboss 7.1.3上部署并使用arquillian进行测试,我正在尝试为其添加代码覆盖率指标。

我正在使用托管容器选项(jboss-as-arquillian-container-managed),现在我只是尝试将一个-javaagent参数添加到arquillian用来启动jboss的jvm参数中,所以我的arquillian.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
    <defaultProtocol type="Servlet 3.0"/>

    <engine>
        <property name="deploymentExportPath">/tmp</property>
    </engine>

    <container qualifier="jboss"  default="true">
        <configuration>
            <property name="outputToConsole">true</property>
            <property name="jbossHome">[jboss home]</property>
            <property name="javaHome">[java home]</property>
            <property name="javaVmArguments">-Xmx2048m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Djboss.server.log.dir=logs -javaagent:[profile]\.m2\repository\org\jacoco\org.jacoco.agent\0.6.2.201302030002\org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=C:\jacoco.exec,includes=*,excludes=,append=true,output=file,classdumpdir=classdumpdir,dumponexit=true</property>
            <property name="startupTimeoutInSeconds">120</property>
            <property name="allowConnectingToRunningServer">true</property>
        </configuration>
    </container>
</arquillian>

我100%确定这个参数被选中,因为创建了jacoco.exec文件和classdumpdir。

问题是jacoco.exec文件为空。 jboss启动,测试运行并成功完成,jboss关闭,classdumpdir被填充(所以根据jacoco规范,这意味着它正确找到我的类)但是jacoco.exec仍然是完全空的。

如果我向完全相同的jboss提供确切的保存javaagent参数,我自己手动启动一切正常。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

好吧,问题是jacoco只在jvm关闭时转储文件内容(它为它注册了一个钩子),而且显然arquillian(至少版本im使用?)并没有很好地关闭jvm。 / p>

我最终将以下方法添加到我的测试类中:

@After
public void writeOutJacocoData() {
    try {
        Class rtClass = Thread.currentThread().getContextClassLoader().getParent().loadClass("org.jacoco.agent.rt.RT");
        Object jacocoAgent = rtClass.getMethod("getAgent", null).invoke(null);
        Method dumpMethod = jacocoAgent.getClass().getMethod("dump", boolean.class);
        dumpMethod.invoke(jacocoAgent, false);
    } catch(ClassNotFoundException e) {
        logger.debug("no jacoco agent attached to this jvm");
    } catch (Exception e) {
        logger.error("while trying to dump jacoco data",e);
    }
}

它的丑陋和野蛮(并使用jacoco类,他们不会在任何公开可用的jacoco文物中发布,因此反射)但是有效。