Отладка тестов Arquillian в IntelliJ

У меня есть проект Java EE, в котором я использую тесты Arquillian с JUnit на JBoss 7 (Windows). Тесты работают нормально, но я не могу их отлаживать.

Из того, что я погуглил (https://community.jboss.org/wiki/WhyDontBreakPointsWorkWhenDebugging ) Я понимаю, что тесты Arquillian выполняются на отдельной виртуальной машине, поэтому IntelliJ не может их отлаживать. Мне нужно IntelliJ для удаленного подключения к этой машине через сокет, но я не знаю, как это сделать.

Я нашел эту тему: Отладка с помощью Arquillian в IntelliJ — управляемый контейнер Однако Я не знаю, как заставить его работать.

Также я перешел через эту тему: http://devnet.jetbrains.com/message/5253623?tstart=0 поэтому я заполнил, надеюсь, подходящую верную часть в моем pom.xml, но это не помогло:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
        <version>2.4.3</version>
        <configuration>
            <debugForkedProcess>true</debugForkedProcess>
        <skip>false</skip>
    </configuration>
 </plugin>

Может ли кто-нибудь объяснить мне, как отлаживать тесты в такой конфигурации?


person Martin Nuc    schedule 20.07.2013    source источник


Ответы (2)


В первую очередь зависит от типа используемого вами контейнера — управляемого, удаленного или встроенного. См. также https://docs.jboss.org/author/display/ARQ/Containers. В последнем случае тесты выполняются в одной и той же JVM, и вы можете, например, отлаживать тест непосредственно в среде IDE.

Конфигурация Surefire в этом случае не важна, потому что вы хотите выполнять отладку в своей среде IDE (если только вы не выполняете цели maven из своей среды IDE).

Для управляемых и удаленных контейнеров вам необходимо отладить фактический контейнер. Чтобы это работало, вы должны передать правильные параметры JVM удаленному контейнеру, чтобы вы могли открыть сеанс удаленной отладки. Один из способов сделать это — через arquillian.xml:

http://jboss.org/schema/arquillian/arquillian

<!-- Need to set the default protocol and use resource filtering, because of https://issues.jboss.org/browse/ARQ-579 -->
<defaultProtocol type="Servlet 3.0"/>

<engine>
    <property name="deploymentExportPath">target/artifacts</property>
</engine>


<container qualifier="incontainer">
    <configuration>
        <property name="jbossHome">${jbossTargetDir}</property>
        <property name="javaVmArguments">-Xmx1024m -XX:MaxPermSize=512m -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005</property>
        <property name="allowConnectingToRunningServer">true</property>
    </configuration>
</container>
0.xsd">

<!-- Need to set the default protocol and use resource filtering, because of https://issues.jboss.org/browse/ARQ-579 -->
<defaultProtocol type="Servlet 3.0"/>

<engine>
    <property name="deploymentExportPath">target/artifacts</property>
</engine>


<container qualifier="incontainer">
    <configuration>
        <property name="jbossHome">${jbossTargetDir}</property>
        <property name="javaVmArguments">-Xmx1024m -XX:MaxPermSize=512m -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005</property>
        <property name="allowConnectingToRunningServer">true</property>
    </configuration>
</container>

The important part in the example above being the javaVmArguments.

person Hardy    schedule 21.07.2013
comment
Я использую управляемый контейнер. Я попытался поиграть с вашим предложением, но при запуске отладки я вижу в консоли: Listening for transport dt_socket at address: 5005 и больше ничего не происходит. Я узнал, что это из-за параметра susspend=y. Думаю, теперь я должен позволить IntelliJ подключиться к сеансу отладки, но я не знаю, как это сделать. - person Martin Nuc; 22.07.2013
comment
Наконец-то я смог отладить свой тест. Я использовал mvn test -Parq-jbossas-managed для запуска виртуальной машины JBoss, а затем использовал удаленный профиль в IntelliJ для подключения к этой виртуальной машине. Можно ли сделать это автоматически в Intellij? Я имею в виду запуск mvn test перед подключением? - person Martin Nuc; 22.07.2013
comment
Я также хотел бы знать, как отладить тест Arquillian, например, простой модульный тест из Idea IDE. - person zbig; 19.05.2015

Я могу запускать тесты Arqullian либо с помощью Maven, либо с помощью IntelliJ. Я использую встроенный контейнер. Самое главное — настроить дом JBoss в arqullian.xml или только в конфигурации Maven, чтобы IntelliJ знал, где находится дом JBoss.

<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">

<engine>
    <property name="deploymentExportPath">testing/target/artifacts</property>
</engine>

<container qualifier="jbossas-managed" default="true">
    <configuration>

        <!-- JBoss embedded does not use this property
        <property name="javaVmArguments">-java.util.logging.manager=org.jboss.logmanager.LogManager -Xmx512m -XX:MaxPermSize=256m -Djava.util.logging.manager=org.jboss.logmanager.LogManager</property>
        -->

        <property name="jbossHome">target/wildfly-8.1.0.Final</property>
        <property name="modulePath">target/wildfly-8.1.0.Final/modules</property>
        <property name="allowConnectingToRunningServer">true</property>
    </configuration>
</container>

IMPORTANT for debugging and running test in IntelliJ:

По какой-то причине вы должны указать диспетчер ведения журналов, чтобы иметь возможность запускать встроенный JBoss. Для Maven это легко, и вы можете установить его в конфигурацию:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <!-- Fork every test because it will launch a separate AS instance -->
                <forkMode>always</forkMode>
                <systemPropertyVariables>
                    <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                </systemPropertyVariables>
                <redirectTestOutputToFile>false</redirectTestOutputToFile>
            </configuration>
        </plugin>

Но IntelliJ не заботится об этих конфигурациях плагинов в Maven, и вы должны установить их непосредственно в конфигурации тестового примера. Я не нашел лучшего решения. Встроенный контейнер не заботится о конфигурации виртуальной машины Java в arqullian.xml.

Конфигурация тестирования IntelliJ Arequllian

Здесь всегда есть возможность отладки посредством удаленной отладки. Мне нравится делать это в IDE. Для меня это более удобный способ. Если вы хотите включить удаленную отладку, вы должны установить конфигурацию JAVA_OPT ни для встроенного контейнера, ни для arqullian.xml.

person Cyva    schedule 20.11.2015