Arquillian Tomee дистанционное покрытие кода Jacoco - PullRequest
0 голосов
/ 16 января 2019

Я делаю интеграционный тест с использованием Arquillian в удаленном TomEE-Plus 7.0.4 и пытаюсь получить покрытие кода с использованием Jacoco 0.8.2 . Мой охват кода не покрывается, так как я использую arquillian-tomee-remote. Так как код не покрыт, не может принять сборку. Мне нужен пример кода с TomEE-Plus Arquillian Remote и покрытие кода с использованием Jacoco. Буду признателен, если получу какой-нибудь пример рабочего кода или пример проекта.

Я использовал цель prepare-agent, которая сгенерирует surefireArgLine (javaagent) и передала то же самое в плагине surefire. Проблема здесь в том, что я использую удаленный Tomee и не знаю, как сгенерировать правильный java-агент 0,2 / org.jacoco.agent-0.8.2-runtime.jar = DestFile = / дом / пользователь / проект / цель / охват-отчеты / jacoco-ut.exec, добавьте = правда, исключает = / конфигурации / * .class: / Util / * Constants.class

Каков правильный параметр javaagent для моей конфигурации, который будет подключаться к arquillian-remote-tomee?

Плагин Jacoco

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${plugin.maven.jacoco.version}</version>
        <configuration>
            <propertyName>coverageAgent</propertyName>
            <append>true</append>
            <excludes>
                <exclude>**/config/*.class</exclude>
                <exclude>**/util/*Constants.class</exclude>
            </excludes>
        </configuration>
        <executions>
            <execution>
                <id>pre-unit-test</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
                <configuration>
                    <destFile>${sonar.jacoco.reportPath}</destFile>
                    <propertyName>surefireArgLine</propertyName>
                    <append>true</append>
                </configuration>
            </execution>
            <execution>
                <id>post-unit-test</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
                <configuration>
                    <dataFile>${sonar.jacoco.reportPath}</dataFile>
                    <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                    <append>true</append>
                </configuration>
            </execution>
            <execution>
                <id>check</id>
                <goals>
                    <goal>check</goal>
                </goals>
                <configuration>
                    <dataFile>${sonar.jacoco.reportPath}</dataFile>
                    <haltOnFailure>true</haltOnFailure>
                    <rules>
                        <rule>
                            <element>BUNDLE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.99</minimum>
                                </limit>
                                <limit>
                                    <counter>BRANCH</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.99</minimum>
                                </limit>
                                <limit>
                                    <counter>CLASS</counter>
                                    <value>MISSEDCOUNT</value>
                                    <maximum>0</maximum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
            </execution>
        </executions>
    </plugin>

Dependency

<dependency>
    <groupId>org.jboss.arquillian.testng</groupId>
    <artifactId>arquillian-testng-container</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.jboss.arquillian.config</groupId>
    <artifactId>arquillian-config-api</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.extension</groupId>
    <artifactId>arquillian-jacoco</artifactId>
    <version>1.0.0.Alpha10</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.agent</artifactId>
    <classifier>runtime</classifier>
    <scope>test</scope>
    <version>${plugin.maven.jacoco.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jacoco/org.jacoco.core -->
<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.core</artifactId>
    <version>${plugin.maven.jacoco.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.apache.tomee</groupId>
    <artifactId>arquillian-tomee-remote</artifactId>
    <version>${tomee.version}</version>
    <scope>test</scope>
</dependency>

Arquillian.xml

<extension qualifier="jacoco">
    <property name="includes">com.demo.*</property>
</extension>

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Я добавил правильный java-агент (surefireArgLine) на удаленный сервер TomEE через catalina, включающий плагин surefire. это работает.

surefireArgLine - будет заполнен подготовительным агентом Surefire во время выполнения.

<tomee.catalina_opts> ${surefireArgLine}</tomee.catalina_opts>
0 голосов
/ 28 января 2019

Вы можете установить catalina_opts в arquillian.xml для контейнера tomee. Отфильтруйте его с помощью maven, чтобы передать jacoco javaagent, и все готово:).

0 голосов
/ 16 января 2019

Отказ от ответственности: я не эксперт ни по Arquillian, ни по TomEE, поэтому вы можете изменить ответ для своих целей.

В любом случае, в двух словах, байт-код инструментов JaCoCo для предоставления отчета о покрытии.

Поскольку при использовании Arquillian фактическое выполнение теста происходит в JVM TomEE, а не в JVM, которая фактически выполняет набор тестов (возможно, CI-сервер или просто скрипт сборки, выполняющий тест), поэтому настройте JaCoCo на этом тестовая машина не сделает много, вам придется настроить сам сервер.

JaCoCo имеет опцию -javaagent для этого, и этот Java-агент будет "перехватывать" загрузку классов сервером и инструктировать их.

Теперь, когда JaCoCo работает, он создает файл jacoco.exec, который на самом деле содержит отчет о покрытии, который может быть показан позже различными способами (плагин jenkins для отображения покрытия, интеграция с гидролокатором). И это, безусловно, наиболее часто используемая опция AFAIK, поэтому, если вы будете использовать этот подход, учитывая, что инструментарий действительно работает, после того, как тесты будут выполнены, вам нужно будет найти сервер на тестовом компьютере и загрузить его на компьютер сборки. и интегрируйся с CI / Sonar как угодно.

Однако есть альтернативные решения:

Документация JaCoCo гласит, что существует три режима запуска инструментирующего Java-агента:

  • Файловая система: при завершении завершения JVM данные записываются в локальный файл.
  • TCP Socket Server: внешние инструменты могут подключаться к JVM и получать данные о выполнении через сокетное соединение. Возможен сброс данных выполнения и сброс данных выполнения при выходе из ВМ.
  • TCP Socket Client: при запуске агент JaCoCo подключается к определенной конечной точке TCP. Данные исполнения записываются в сокет соединения по запросу. Возможен сброс данных выполнения и сброс данных выполнения при выходе из ВМ.

Технически вы можете просто указать разные параметры для этого javaagent, чтобы он запускал JaCoCo в одном из этих режимов.

В любом случае, мы обсудили первый вариант, но вы также можете работать с конфигурациями TCP, если это необходимо. Конечно, здесь вам придется решать проблемы безопасности (например, разрешение на доступ / доступ к порту и т. Д.).

Если вы работаете в режиме TCP, вам может пригодиться Maven Plugin . Я не использовал его сам, просто погуглил, поэтому не могу комментировать, хорошо ли это, у него всего 2 звезды на Github, так что, вероятно, он не готов к производству, но, возможно, вы могли бы получить некоторые идеи из его исходного кода.

...