2015-11-11 15 views
0

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

<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 агент в Params, но ничего ...

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

+1

Где вы проходите файл jacocoagent.jar при передаче аргументов агента. Кроме того, вам может потребоваться остановить ваш экземпляр (причал), чтобы он мог очистить данные покрытия до файла jacoco-it.exec. После того, как Jetty остановится, если ваши тесты пройдут (с успехом или неудачей), вы увидите, что размер файла jacoco-it.exec будет расти больше, а затем jacoco сможет генерировать%. –

+0

Куда я их проезжаю? в start-jetty ( -Denv = it -Djetty.port = 8081 $ {failafeArgLine}) Я вижу эту строку в журналах maven - failafeArgLine установлен в -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 – Johny19

ответ

1

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

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

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

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

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

Я получил ваш пример работает (с некоторым записанном покрытия) путем изменений для подготовки агента-интеграции, отчета-интеграции и перемещения плагина, прежде чем плагин причала в файле 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> 
+0

Я заметил, что у него два гола в github например, https://github.com/daniellundmark/jetty-jacoco-example/blob/master/pom.xml, тогда как приведенный выше код не показывает этого. Я полагаю, что приведенный выше код правильный. – Stephane

+0

С этой конфигурацией у вас все еще есть свой причал? – Stephane

+0

Вам не нужны ваши цели: ' start run-forked'? – Stephane

3

Есть много ответов там от людей, которые прочитали помощь и отвечали без каких-либо идей о том, что действительно, чтобы заставить его работать.

Итак, мы пошли.

Прежде всего. 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 forked, вы не можете использовать <webApp>...</webApp> для определения пути к контексту. Для этого вам понадобится файл context.xml. Я использую один для Jetty, а другой для Tomcat (производство). См. Содержание ниже.
  4. Отчеты Jacoco по интеграционным испытаниям не могут быть связаны с фазой post-integration-test, иначе вы сообщаете результаты, прежде чем собирать их. (Предполагая, что вы хотите сообщить Жакоко, если вы не пропустите это).Поэтому вам необходимо привязать его к следующей доступной фазе, которая будет подтвердить.
  5. maxStartupLines используется, чтобы Jetty знал, сколько строк инициализации он может игнорировать, прежде чем предположить, что произошла ошибка инициализации. Возможно, вам придется настроить это.

context.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