Плагин Jacoco и jetty maven получает покрытие 0%

Я пытаюсь настроить jacoco, чтобы получить покрытие для моих интеграционных тестов. Я запускаю свои интеграционные тесты для причала (используя плагин maven). Но даже если я передам агенту в аргументах джема при запуске сервера причала, отчет jacoco показывает 0%. Вот мой пом.xml

<groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>start-jetty</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>run-forked</goal>
            </goals>
            <configuration>
              <waitForChild>false</waitForChild>
              <jvmArgs>-Denv=it -Djetty.port=8081 ${failsafeArgLine}</jvmArgs>
              <webApp>
                <contextPath>/myContext</contextPath>
              </webApp>
            </configuration>
          </execution>
          <execution>
            <id>stop-jetty</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <stopPort>8082</stopPort>
          <stopKey>test</stopKey>
        </configuration>
      </plugin>

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.12.4</version>
        <configuration>
          <includes>
            <include>**/*IntegrationTest.java</include>
          </includes>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
            <configuration>
              <argLine>${failsafeArgLine}</argLine>
            </configuration>
          </execution>
        </executions>
      </plugin>

<plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <executions>

          <execution>
            <id>pre-integration-test</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <configuration>

              <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>

              <propertyName>failsafeArgLine</propertyName>
            </configuration>
          </execution>

          <execution>
            <id>post-integration-test</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>report</goal>
            </goals>
            <configuration>

              <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>

              <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
            </configuration>
          </execution>

        </executions>
      </plugin>

Как видите, я запускаю пристань в режиме форка и передаю агент jacoco в параметрах, но ничего...

Есть ли что-то дополнительное, что мне нужно добавить?


person Johny19    schedule 11.11.2015    source источник
comment
Где вы передаете файл jacocoagent.jar при передаче аргументов агента. Кроме того, вам может потребоваться остановить ваш экземпляр (причал), чтобы он мог сбросить данные о покрытии в файл jacoco-it.exec. После того, как Jetty остановится, если ваши тесты прошли (успешно или неудачно), вы увидите, что размер файла jacoco-it.exec увеличится, и тогда jacoco сможет генерировать %.   -  person AKS    schedule 11.11.2015
comment
Где я их прохожу? в start-jetty (‹jvmArgs›-Denv=it -Djetty.port=8081 ${failsafeArgLine}‹/jvmArgs›) я вижу эту строку в журналах maven – для failsafeArgLine установлено значение -javaagent:/mypath/repository/org /jacoco/org.jacoco.agent/0.7.5.201505241946/org.jacoco.agent-0.7.5.201505241946-runtime.jar=destfile=/targetpath/keepmypet/target/coverage-reports/jacoco-it.exec   -  person Johny19    schedule 11.11.2015


Ответы (2)


Есть много ответов от людей, которые прочитали справку и ответили, не имея ни малейшего представления о том, что действительно нужно, чтобы заставить это работать.

Так мы пошли..

Перво-наперво. Maven запускает вещи на основе фаз, к которым они привязаны, однако, если у вас есть две вещи, привязанные к одной и той же фазе, Maven будет выполнять их в том порядке, в котором они появляются в файле POM, поэтому в этом случае порядок имеет значение.

Вот как выглядит мой файл POM:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <configuration>
                <argLine>${surefireArgLine}</argLine>
                <skipTests>${skip.unit.tests}</skipTests>
                <excludes>
                    <exclude>**/*TestSuite*</exclude>
                    <exclude>**/*ITest*</exclude>
                </excludes>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.12</version>
            <configuration>
                <skipTests>${skip.integration.tests}</skipTests>
                <includes>
                    <include>**/*TestSuite*</include>
                    <include>**/*ITest*</include>
                </includes>
                <systemPropertyVariables>
                     ... //Whatever you need to configure on your integration test, if any.
                </systemPropertyVariables>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.5.201505241946</version>
            <executions>
                <execution>
                    <id>pre-unit-test</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                        <excludes>
                            <exclude>**/*Test*</exclude>
                        </excludes>
                        <propertyName>surefireArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>post-unit-test</id>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>pre-integration-test</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                        <excludes>
                            <exclude>**/*Test*</exclude>
                        </excludes>
                        <propertyName>jacoco.agent.itArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.2.10.v20150310</version>
            <configuration>
                <scanIntervalSeconds>10</scanIntervalSeconds>
                <stopKey>foo</stopKey>
                <stopPort>9999</stopPort>
                <httpConnector>
                    <port>${it.server.port}</port>
                </httpConnector>
                <contextXml>jetty_context.xml</contextXml>
            </configuration>
            <executions>
                <execution>
                    <id>start-jetty</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>run-forked</goal>
                    </goals>
                    <configuration>
                        <scanIntervalSeconds>0</scanIntervalSeconds>
                        <daemon>true</daemon>
                        <waitForChild>false</waitForChild>
                        <maxStartupLines>200</maxStartupLines>
                        <jvmArgs>${jacoco.agent.itArgLine} -Djetty.port=${it.server.port}</jvmArgs>
                    </configuration>
                </execution>
                <execution>
                    <id>stop-jetty</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Это реальная рабочая конфигурация POM.xml. Теперь давайте перейдем к важным деталям:

  1. Плагин Jacoco должен работать с плагином Jetty, иначе у вас не будет свойства с конфигурацией javaagent.
  2. Вы должны запускать разветвленную версию Jetty, иначе Jetty не примет конфигурацию javaagent.
  3. Поскольку вы запускаете разветвление Jetty, вы не можете использовать <webApp>...</webApp> для определения контекстного пути. Для этого вам понадобится файл context.xml. Я использую один для Jetty, а другой для Tomcat (производство). См. содержание ниже.
  4. Отчеты Jacoco по интеграционным тестам нельзя привязывать к фазе после интеграционного тестирования, иначе вы будете сообщать о результатах до их фактического сбора. (Предполагая, что вы хотите, чтобы Jacoco сообщил, если вы не пропустите это). Поэтому вам нужно привязать его к следующей доступной фазе, которой будет проверка.
  5. maxStartupLines используется, чтобы Jetty знал, сколько строк инициализации он может игнорировать, прежде чем предположить, что произошла ошибка инициализации. Возможно, вам придется настроить это.

Контекст.xml (jetty_context.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"     "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="contextPath">/myApp</Set>
  <Set name="extraClasspath">comma-separated list of additional classpaths, such as resources</Set>
</Configure>

Если вы хотите также сообщить о покрытии кода в SonarQube:

<properties>
    <sonar.jacoco.reportPath>${project.build.directory}/coverage-reports/jacoco-ut.exec</sonar.jacoco.reportPath>
    <sonar.jacoco.itReportPath>${project.build.directory}/coverage-reports/jacoco-it.exec</sonar.jacoco.itReportPath>
</properties>

Если все остальное правильно, вы сможете запустить: mvn clean install sonar:sonar

person Adriano Vieira    schedule 15.02.2016

За последние пару дней я немного поработал с настройкой, и здесь есть рабочий пример:

https://github.com/daniellundmark/jetty-jacoco-example

Может быть, это может помочь вам.

При запуске вашего примера выше я получил эту ошибку:

[INFO] Forked process starting
[INFO] Forked process startup errors

Я заставил ваш пример работать (с некоторым записанным освещением), изменив на prepare-agent-integration, report-integration и переместив плагин перед плагином причала в файле pom.

Было полезно запустить mvn -X pre-integration-test, чтобы увидеть, что произошло. Но взгляните и на пример выше. Надеюсь, это поможет вам.

Вот плагины, которые я получил в файле pom.xml при изменении вашего примера:

            <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>start-jetty</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>run-forked</goal>
                    </goals>
                    <configuration>
                        <waitForChild>false</waitForChild>
                        <jvmArgs>${failsafeArgLine} -Denv=it -Djetty.port=8081</jvmArgs>
                        <webApp>
                            <contextPath>/myContext</contextPath>
                        </webApp>
                    </configuration>
                </execution>
                <execution>
                    <id>stop-jetty</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <stopPort>8082</stopPort>
                <stopKey>test</stopKey>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                    <configuration>
                        <argLine>${failsafeArgLine}</argLine>
                    </configuration>
                </execution>
            </executions>
        </plugin>
person Daniel Lundmark    schedule 15.11.2015
comment
Я заметил, что у него есть две цели в примере с github по адресу github.com. /danielundmark/jetty-jacoco-example/blob/master/, тогда как приведенный выше код этого не показывает. Я полагаю, что приведенный выше код является правильным. - person Stephane; 18.12.2015
comment
С этой конфигурацией ваш причал все еще запускается? - person Stephane; 18.12.2015
comment
Разве вам не нужно, чтобы ваши цели были такими: <goal>start</goal><goal>run-forked</goal> ? - person Stephane; 18.12.2015
comment
Что ж, цель, отсутствующая в этом примере, — это ‹цель›стоп‹/стоп›. Строго не требуется. Я просто использую его, чтобы остановить любой бродячий процесс, который был запущен с тех пор. Но на всякий случай пользуюсь. Но у вас не должно быть ‹цель›начало‹/цель›. Вместо этого я использую run-forked, чтобы гарантировать запуск новой JVM, использующей JaCoCo-агент. Это то, что заставляет покрытие кода работать. Любой из примеров работает. Я все время использую что-то очень близкое к GitHub-примеру. Просто продолжайте спрашивать, могу ли я чем-то помочь вам. - person Daniel Lundmark; 19.12.2015
comment
Я все еще борюсь с этим. Теперь я могу запустить Jetty в разветвленном режиме, и он запускается нормально, тесты выполняются, но результаты охватывают нулевой процент. Я опубликовал свою проблему по адресу stackoverflow.com/questions/34343214/ Если вы можете помочь, это было бы здорово, Я совсем застрял здесь. - person Stephane; 21.12.2015