У меня есть отчет для покрытия кода с помощью интеграции .Как создать сборку 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?
Я пробовал это, но это ничего не изменило. Аль-проценты по-прежнему равны нулю. Только тестовые классы отображаются на странице html-сессии. Ни один из основных классов. – Stephane
Мой главный код java запускается, поскольку тесты интеграции дают успешную сборку Maven. Но, тем не менее, мой главный Java-код не указан на веб-странице «Сессии». Как проверить, прикреплен ли агент Jacoco к правильной JVM, который запускает мой основной Java-код? – Stephane