2015-12-17 6 views
3

У меня есть отчет для покрытия кода с помощью интеграции .Как создать сборку Maven для запуска сервера Jetty в разветвленном режиме перед запуском тестов интеграции?

У меня есть интеграционные тесты, и они успешно выполняются в сборке Maven.

Когда я нажимаю на ссылку «Сессии» в верхнем правом углу отчета HTML, я могу видеть свои тестовые классы в списке, но я не вижу своих основных классов, которые выполняются в настоящее время, и весь охват процентные доли отчета равны нулю.

В качестве примечания стороны, мой блок испытательное покрытие работает нормально, при этом проценты отображаются в порядке.

Моя конфигурация выглядит следующим образом:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     <argLine>${surefireArgLine}</argLine> 
     <excludes> 
     <exclude>**/integrationtest/*.java</exclude> 
     </excludes> 
    </configuration> 
    </plugin> 

    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     <argLine>${failsafeArgLine}</argLine> 
     <skipTests>${skipIntegrationTests}</skipTests> 
     <includes> 
     <include>**/integrationtest/*.java</include> 
     </includes> 
    </configuration> 
    <executions> 
     <execution> 
     <id>integration-test</id> 
     <goals> 
      <goal>integration-test</goal> 
     </goals> 
     </execution> 
     <execution> 
     <id>verify</id> 
     <goals> 
      <goal>verify</goal> 
     </goals> 
     </execution> 
    </executions> 
    </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> 
      <propertyName>surefireArgLine</propertyName> 
     </configuration> 
     </execution> 
     <execution> 
     <id>post-unit-test</id> 
     <phase>test</phase> 
     <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-integration</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-integration</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.2.v20140723</version> 
    <configuration> 
     <httpConnector> 
     <port>${jetty.port}</port> 
     </httpConnector> 
     <scanIntervalSeconds>10</scanIntervalSeconds> 
     <stopPort>8805</stopPort> 
     <stopKey>STOP</stopKey> 
    </configuration> 
    <executions> 
     <execution> 
     <id>start-jetty</id> 
     <phase>pre-integration-test</phase> 
     <goals> 
      <goal>stop</goal> <!-- stop any stray process that has been running since before --> 
      <goal>run-forked</goal> 
     </goals> 
     <configuration> 
      <scanIntervalSeconds>0</scanIntervalSeconds> 
      <daemon>true</daemon> 
      <waitForChild>false</waitForChild> 
      <maxStartupLines>200</maxStartupLines> 
      <jvmArgs>${failsafeArgLine} -Djetty.port=${jetty.port}</jvmArgs> 
     </configuration> 
     </execution> 
     <execution> 
     <id>stop-jetty</id> 
     <phase>post-integration-test</phase> 
     <goals> 
      <goal>stop</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

Обратите внимание, как плагин JaCoCo определяется перед тем причалу один.

В журнале консоли отображается журнал неудачных попыток подключения. Тесты интеграции не могут подключаться к локальному хосту. Это связано с тем, что сервер Jetty не успел начать, пока Maven не провела тесты.

org.apache.http.conn.HttpHostConnectException: Connection to http://localhost:8888 refused 

Вот еще один консольный лог бит:

[STDERR] 2015-12-21 09:49:43.486:WARN:oejuc.AbstractLifeCycle:main: FAILED [email protected]{HTTP/1.1}{0.0.0.0:8080}: java.net.BindExcep 
tion: Address already in use 
[STDERR] java.net.BindException: Address already in use 
[STDERR]  at sun.nio.ch.Net.bind0(Native Method) 
[STDERR]  at sun.nio.ch.Net.bind(Net.java:436) 
[STDERR]  at sun.nio.ch.Net.bind(Net.java:428) 
[STDERR]  at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214) 
[STDERR]  at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) 
[STDERR]  at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:277) 
[STDERR]  at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) 
[STDERR]  at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:216) 
[STDERR]  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
[STDERR]  at org.eclipse.jetty.maven.plugin.MavenServerConnector.doStart(MavenServerConnector.java:120) 
[STDERR]  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
[STDERR]  at org.eclipse.jetty.server.Server.doStart(Server.java:359) 
[STDERR]  at org.eclipse.jetty.maven.plugin.JettyServer.doStart(JettyServer.java:76) 
[STDERR]  at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
[STDERR]  at org.eclipse.jetty.maven.plugin.Starter.run(Starter.java:401) 
[STDERR]  at org.eclipse.jetty.maven.plugin.Starter.main(Starter.java:516) 
[STDERR] 2015-12-21 09:49:43.486:WARN:oejuc.AbstractLifeCycle:main: FAILED [email protected]: java.net.BindException: Address already in use 
[STDERR] java.net.BindException: Address already in use 
[STDERR]  at sun.nio.ch.Net.bind0(Native Method) 
[STDERR]  at sun.nio.ch.Net.bind(Net.java:436) 

Имея значение вместо run-forked для цели start имеет испытания работать нормально. Но для отчета о покрытии кода мне нужно, чтобы он был run-forked.

Использование опции <waitForChild>false</waitForChild> ничего не изменило.

Как построить сборку Maven для запуска сервера Jetty в разветвленном режиме перед запуском интеграционных тестов?

UPDATE: Я мог бы построить Maven для запуска сервера Jetty в режиме вилки со следующим параметром <maxStartupLines>200</maxStartupLines>.

Но теперь ни один из моих тестов интеграции, хотя они выполнены нормально, рассматривается в отчете.

Мой журнал говорит:

[INFO] --- jacoco-maven-plugin:0.7.5.201505241946:prepare-agent-integration (pre-integration-test) @ rest --- 
[INFO] failsafeArgLine set to -javaagent:/home/stephane/.m2/repository/org/jacoco/org.jacoco.agent/0.7.5.201505241946/org.jacoco.agent-0.7.5.201505241946-runtime.jar=destfile=/home/stephane/source/...-rest/rest/target/coverage-reports/jacoco-it.exec 

[INFO] <<< jetty-maven-plugin:9.2.2.v20140723:run-forked (start-jetty) @ rest <<< 
[INFO] 
[INFO] --- jetty-maven-plugin:9.2.2.v20140723:run-forked (start-jetty) @ rest --- 
[INFO] Configuring Jetty for project: Rest 
[INFO] webAppSourceDirectory not set. Trying src/main/webapp 
[INFO] Reload Mechanic: automatic 
[INFO] Classes = /home/stephane/source/...-rest/rest/target/classes 
[INFO] Context path =/
[INFO] Tmp directory = /home/stephane/source/...-rest/rest/target/tmp 
[INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml 
[INFO] Web overrides = none 
[INFO] web.xml file = file:/home/stephane/source/...-rest/rest/src/main/webapp/WEB-INF/web.xml 
[INFO] Webapp directory = /home/stephane/source/...-rest/rest/src/main/webapp 

[INFO] Forked process starting 
[INFO] Forked process started. 

UPDATE: Если я выполнить команду Maven mvn jacoco:report-integration консоль сетует с отсутствующим файлом данных:

[INFO] --- jacoco-maven-plugin:0.7.5.201505241946:report-integration (default-cli) @ rest --- 
[INFO] Skipping JaCoCo execution due to missing execution data file:/home/stephane/source/...-rest/rest/target/jacoco-it.exec 

Действительно файл данных указан в ПОМ. xml как <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>

Почему это выглядело как jacoco-it.exec вместо coverage-reports/jacoco-it.exec?

Это потому, что отчет JaCoCo создается до того, как сервер Jetty успел остановить и создать файл данных? Но почему другой путь к файлу? И как сообщить отчет JaCoCo подождать?

UPDATE: Я добавил stopWait от 1 до stop целей интеграционного теста:

<execution> 
    <id>stop-jetty</id> 
    <phase>post-integration-test</phase> 
    <goals> 
     <goal>stop</goal> 
    </goals> 
    <configuration> 
     <stopWait>1</stopWait> 
    </configuration> 
    </execution> 

Но это ничего не изменило к этому вопросу.

UPDATE: Запуск сборки с опцией -X показал следующее:

[INFO] 
[INFO] --- jacoco-maven-plugin:0.7.5.201505241946:report-integration (post-integration-test) @ rest --- 
[DEBUG] Configuring mojo org.jacoco:jacoco-maven-plugin:0.7.5.201505241946:report-integration from plugin realm ClassRealm[plugin>org.jacoco:ja 
coco-maven-plugin:0.7.5.201505241946, parent: [email protected]] 
[DEBUG] Configuring mojo 'org.jacoco:jacoco-maven-plugin:0.7.5.201505241946:report-integration' with basic configurator --> 
[DEBUG] (f) dataFile = /home/stephane/source/...-rest/rest/target/coverage-reports/jacoco-it.exec 
[DEBUG] (f) outputDirectory = /home/stephane/source/...-rest/rest/target/site/jacoco-it 
[DEBUG] (f) outputEncoding = UTF-8 
[DEBUG] (f) project = MavenProject: no.....db:rest:1.40.0-SNAPSHOT @ /home/stephane/source/...-rest/rest/pom.xml 
[DEBUG] (f) skip = false 
[DEBUG] (f) sourceEncoding = UTF-8 
[DEBUG] -- end configuration -- 
[INFO] Analyzed bundle 'Rest' with 50 classes 
[INFO] 
[INFO] --- jetty-maven-plugin:9.2.2.v20140723:stop (stop-jetty) @ rest --- 
[DEBUG] Configuring mojo org.eclipse.jetty:jetty-maven-plugin:9.2.2.v20140723:stop from plugin realm ClassRealm[plugin>org.eclipse.jetty:jetty-maven-plugin:9.2.2.v20140723, parent: [email protected]] 
[DEBUG] Configuring mojo 'org.eclipse.jetty:jetty-maven-plugin:9.2.2.v20140723:stop' with basic configurator --> 
[DEBUG] (s) stopKey = STOP 
[DEBUG] (s) stopPort = 8805 
[DEBUG] (f) stopWait = 1 
[DEBUG] -- end configuration -- 
[INFO] Waiting 1 seconds for jetty to stop 
[INFO] Server reports itself as stopped 

Это говорит мне отчет в настоящее время производится до того, как сервер Jetty остановился. Если это так, значит, он неисправен. Как получить отчет, созданный после остановки сервера Jetty?

ответ

0

После прочтения немного о плагине на http://eclemma.org/jacoco/trunk/doc/report-integration-mojo.html я заметил, что он сказал:

Персональных по умолчанию к фазе жизненного цикла: проверить.

Таким образом, изменение:

<execution> 
     <id>post-integration-test</id> 
     <phase>verify</phase> 
     <goals> 
      <goal>report-integration</goal> 
     </goals> 
     <configuration> 
      <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile> 
      <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory> 
     </configuration> 
    </execution> 

(или просто оставить вне фазы) и она должна работать.

+0

Я пробовал это, но это ничего не изменило. Аль-проценты по-прежнему равны нулю. Только тестовые классы отображаются на странице html-сессии. Ни один из основных классов. – Stephane

+0

Мой главный код java запускается, поскольку тесты интеграции дают успешную сборку Maven. Но, тем не менее, мой главный Java-код не указан на веб-странице «Сессии». Как проверить, прикреплен ли агент Jacoco к правильной JVM, который запускает мой основной Java-код? – Stephane