【问题标题】:arquillian jboss as7 managed and jacoco - jacoco.exec file is emptyarquillian jboss as7 托管和 jacoco - jacoco.exec 文件为空
【发布时间】:2013-07-29 23:07:18
【问题描述】:

我有一个部署在 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 仍然完全为空。

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

我做错了什么?

【问题讨论】:

标签: java jboss jboss-arquillian jacoco


【解决方案1】:

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

我最终在我的测试类中添加了以下方法:

@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 类,因此是反射)但可以。

【讨论】:

  • 你使用的是什么版本的 arquillian?
  • 您的设置似乎还有其他问题。这不会发生在我身上。
  • @JohnAment - 到目前为止,我的设置已经在多台机器上运行了长达数小时的 arquillian 测试数月。如果您有任何想要我发表的意见,我很乐意。
  • 我有一个项目需要和你一样的步骤。我尝试了您的方法@After,但在第一行出现异常,它没有找到类 org.jacoco.agent.rt.RT。我错过了什么?谢谢
  • @FlorinVistig - 最新的 jacoco 0.7.5 仍然包含该名称下的代理类。我猜你的类加载器结构与我的设置不同。不幸的是,我不能真正帮助你。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多