2013-11-21 1 views
4

Я пишу многомодульное приложение. Некоторые из модулей - это просто базовые библиотеки Java, которые затем включены в WAR Webapp.Покрытие кода веб-приложения клиента/сервера

Я хотел бы запустить покрытие кода в следующем сценарии:

  • Я бегу веб-приложение, с помощью встроенного Jetty, который запускается с помощью Maven.

  • У меня есть тесты, выполняющие HTTP-запросы против webapp.

  • Я хотел бы получить код, охватываемый webapp, а также тестами.

Возможно ли это, и как это можно достичь с помощью Cobertura, JaCoCo или Emma? Насколько я понимаю, охват кода будет охватывать только клиентский код в этом сценарии. Я прав?

+0

Из интереса: не могли бы вы объяснить, как вы выполняете тесты? Это работает автоматически или вам нужно вручную управлять причалом и вызывающим абонентом? – PepperBob

+0

Ну, на данный момент у меня есть проект на основе Maven, который запускает Jetty с одним из веб-модулей. Охват кода выполняется в Jenkins с помощью плагина Sonar. Тесты JUnit 4.x. Если возможно, я думаю, мне нужно использовать JaCoCo. Должен ли я использовать какой-то плагин Maven для этого, или он будет подхвачен Sonar ...? – carlspring

+0

Плагин JaCoCo Maven в проекте запустит агента, а действие Post-build Action в Jenkins станет инструментом Sonar. Вот как это работает здесь с Unit Tests. – PepperBob

ответ

2

Я думаю, что если вам удастся прикрепить JaCoCo-agent к jvm, который запускает причал, он должен иметь возможность измерять, какой код вызывается за время запуска интеграционных тестов против вашего webapp. Таким образом, вы должны получить статистику, которая показывает вам охват кода.

Существует плагин JaCoCo Maven - хотя я не уверен, что это поможет вам в сценарии. Просто использовал его во время модульных тестов.

Edit: нашел блог-пост, который, кажется, указывает на правильное направление здесь Measure Code Coverage by Integration Tests with Sonar

1

Вы можете использовать Jacoco плагин для создания покрытия кода Вот конфигурация плагин, который я использовал для покрытия JUnit тест-кода.

<plugin> 
       <groupId>org.jacoco</groupId> 
       <artifactId>jacoco-maven-plugin</artifactId> 
       <version>0.5.10.201208310627</version> 
       <configuration> 
        <skip>${maven.test.skip}</skip> 
        <output>file</output> 
        <append>true</append> 
       </configuration> 
       <executions> 
        <execution> 
         <id>jacoco-initialize</id> 
         <goals> 
          <goal>prepare-agent</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>jacoco-site</id> 
         <phase>verify</phase> 
         <goals> 
          <goal>report</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

Примечания: вы можете получить жизненный цикл не охватывает ошибку в мавена при использовании затмения, один пути вы явно указать жизненный цикл управления с помощью плагина. Я установил jacoco плагин от рынка, которая решена моя проблема

+0

Я не использую Eclipse. Меня больше интересует только создание отчетов при их запуске на сервере CI (Jenkins в моем случае) и сохранение результатов для Sonar. Будет ли это работать ...? – carlspring

+0

Не уверен. Я использую eclipse/command prompt. поэтому в командной строке запускаю mvn-тест, который будет генерировать файл jacoco exec после fork для jvm во время запуска тестового примера. Затем запустите mvn jacoco: отчет для создания отчета в формате html –

1

Вот как я достиг этого

Предполагая, что у вас уже есть минимальный pom.xml конфигурации:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</ 
    <version>0.7.4.201502262128</vers 
</plugin> 
  1. Download JaCoCo's agent и копию jacocoagent.jar в подходящее место (например, $HOME/tools/jacocoagent0.7.4.jar)

  2. Приложить агент JaCoCo к виртуальной машине Java Maven с помощью:

    export MAVEN_OPTS="$MAVEN_OPTS \ 
    -javaagent:$HOME/tools/jacocoagent0.7.4.jar=output=tcpserver,port=6300" 
    
  3. Запустите приложение со встроенным сервером молов, например,mvn jetty:run

  4. Выполнить тесты интеграции

  5. В другой оболочке, свалка и сообщить через mvn jacoco:dump jacoco:report

  6. Открыть отчет о ./target/site/index.html (по умолчанию)

1

У нас был подобный сценарий где интеграционный тест выполнялся на причальном сервере. Также нам нужен был комбинированный отчет для всей единицы тестирования и интеграции. Решение, которое мы реализовали, состояло в том, чтобы запустить размотанную пристань и передать jvmargs с деталями jacoco javaagent. В наших отчетах о покрытии кода были рассмотрены все остальные java-коды api и java-сервиса. П конфигурация для jacoco

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>${jacoco-maven-plugin.version}</version> 
    <configuration> 
     <append>true</append> 
    </configuration> 
    <executions> 
     <execution> 
      <id>prepare-test</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco.exec</destFile> 
       <propertyName>surefireArgLine</propertyName> 
      </configuration> 
     </execution> 
     <execution> 
      <id>prepare-integration</id> 
      <goals> 
       <goal>prepare-agent-integration</goal> 
      </goals> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco.exec</destFile> 
       <propertyName>failsafeArgLine</propertyName> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

С выше конфигурации мы получили общий EXEC файл как для блока и тестирования интеграции. Затем мы настроили причал для запуска-раздвоенного

<plugin> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>${jetty-maven-plugin.version}</version> 
    <configuration> 
     <stopKey>foo</stopKey> 
     <stopPort>9999</stopPort> 
     <webApp> 
      <contextPath>/myway</contextPath> 
      <descriptor>src/main/webapp/WEB-INF/web.xml</descriptor> 
     </webApp> 
     <!-- passing the jacoco plugin as a jvmarg --> 
     <jvmArgs>${failsafeArgLine}</jvmArgs> 
    </configuration> 
    <executions> 
     <execution> 
      <id>start-jetty</id> 
      <phase>pre-integration-test</phase> 
      <configuration> 
       <daemon>true</daemon> 
       <waitForChild>false</waitForChild> 
      </configuration> 
      <goals> 
       <goal>run-forked</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>stop-jetty</id> 
      <phase>post-integration-test</phase> 
      <goals> 
       <goal>stop</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Это запустит причал в отдельной JVM с jvmargs. Наконец, мы сгенерировали отчет в теге отчетности pom. Мы заметили, что добавление отчета в плагины сборки не учитывало интеграционные тесты, выполняемые причалом.

<reporting> 
    </plugins> 
    <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco-maven-plugin.version}</version> 
     <reportSets> 
      <reportSet> 
       <id>jacoco-report</id> 
       <reports> 
        <report>report</report> 
       </reports> 
      </reportSet> 
     </reportSets> 
     </plugin> 
    </plugins> 
</reporting> 

Отчеты могут быть доступны на целевой/сайт/jacoco/index.html, попеременно вы можете запустить его из командной строки.

МВН jacoco: доклад

Надеется, что это помогает.

Смежные вопросы