在运行集成测试之前,如何让 Maven 构建等待 Jetty 服务器以分叉模式启动?

2023-12-06

我有一份关于代码覆盖率的报告一体化 test.

我确实有集成测试,并且这些测试在 Maven 构建中成功运行。

当我单击 HTML 报告右上角的“会话”链接时,我可以在列表中看到我的测试类,但我看不到现在由测试执行的主要类,并且所有覆盖率报告百分比均位于零。

作为旁注,我的unit测试覆盖率工作正常,百分比显示正常。

我的配置如下:

  <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 插件是如何定义的before码头那一号。

控制台日志显示失败的连接尝试的日志。集成测试无法连接到本地主机。这是因为在 Maven 运行测试之前 Jetty 服务器还没有时间启动。

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

这也是另一个控制台日志位:

[STDERR] 2015-12-21 09:49:43.486:WARN:oejuc.AbstractLifeCycle:main: FAILED ServerConnector@2cd9b65d{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 org.eclipse.jetty.maven.plugin.MavenServerConnector@630b8061: 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)

拥有start值而不是run-forked因为目标是让测试运行良好。但我需要把它作为run-forked用于代码覆盖率报告。

使用<waitForChild>false</waitForChild>选项对问题没有任何改变。

在运行集成测试之前,如何让 Maven 构建等待 Jetty 服务器以分叉模式启动?

更新:我可以让 Maven 构建等待 Jetty 服务器以 fork 模式启动,如下所示<maxStartupLines>200</maxStartupLines> option.

但现在,我的集成测试虽然运行良好,但都没有在报告中看到。

我的日志说:

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

更新:如果我运行 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

事实上,数据文件在 pom.xml 文件中指定为<dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>

为什么它看起来像jacoco-it.exec代替coverage-reports/jacoco-it.exec ?

是因为 JaCoCo 报告是在 Jetty 服务器有时间停止并生成数据文件之前生成的吗?但为什么文件路径不同呢?以及如何告诉JaCoCo报告等待呢?

更新:我添加了一个stopWait1 到stop集成测试的目标:

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

但这对问题没有任何改变。

更新:使用以下命令运行构建-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: sun.misc.Launcher$AppClassLoader@5c647e05]
[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: sun.misc.Launcher$AppClassLoader@5c647e05]
[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服务器停止后如何生成报告?


阅读了一些有关该插件的信息后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>

(或者只是省略该阶段)并且它应该可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行集成测试之前,如何让 Maven 构建等待 Jetty 服务器以分叉模式启动? 的相关文章

  • jacoco的使用

    一 概述Java 覆盖率 Jacoco 插桩的不同形式总结和踩坑记录 TesterHome 测试覆盖率 xff0c 老生常谈的话题 因为我测试理论基础不是很好 xff0c 就不提什么需求覆盖率啦这样那样的主题了 xff0c 直奔主题 xff
  • 在idea中使用JaCoCo插件统计单元测试覆盖率

    在后台工程师开发完新代码交给QA进行测试时 软件测试人员一般都会要求后台开发对单元测试的覆盖率达到一定的标准 例如我们的标准是分支覆盖率达到50 以上 函数覆盖率达到50 以上 在idea中查看覆盖率挺简单的 idea中支持三种插件来查看覆
  • Android Gradle Jacoco:用于集成测试的离线工具

    我们正在构建一个 Android 应用程序 并使用 Appium 进行测试 现在我想看看我们的 Appium 测试的测试覆盖率 我认为这是可能的 因为Jacoco支持离线检测 http www eclemma org jacoco trun
  • Android jacoco 覆盖率空与 gradle

    我正在尝试让 jacoco 为我的 android 测试项目创建一个代码覆盖率报告 我在 build gradle 中有以下内容 apply plugin com android application apply plugin jacoc
  • 执行 JaCoCo 时出现“由于缺少执行数据文件而跳过 JaCoCo 执行”

    我正在使用 Maven 3 0 3 JUnit 4 8 1 和 Jacoco 0 6 3 201306030806 并且我正在尝试创建测试覆盖率报告 我有一个仅包含单元测试的项目 但无法运行报告 我反复收到错误 Skipping JaCoC
  • JaCoCo gradle 插件排除

    我想从 JaCoCo 中排除一些类 但排除似乎不起作用 例如 我想排除所有以 Ies 结尾的 Java 类 例如 com company EmployeeS 我已经尝试了以下代码 但当我将其推送到声纳 使用 JacocoTestReport
  • 使用 Jacoco 对使用 Powermock 编写的测试类进行单元测试覆盖率

    我正在尝试在詹金斯上的 sonarqube 仪表板上获取代码覆盖率报告 代码覆盖率报告即将发布 但仅显示 4 6 的覆盖率 经过调查 我发现使用 PowerMocks 编写的测试类被跳过 经过进一步调查 我发现 JaCoCo 不能很好地处理
  • Jacoco 排除类

    您好 我正在尝试使用 jacoco 排除代码覆盖率的类 我想排除 gui 文件夹及其中的所有类
  • 如何从 jacoco.exec 中提取可读格式的报告?

    我有一个 jacoco agent 为我的 Maven 项目 Java 生成的文件 名为jacoco exec 如何将此文件转换为人类可读的格式 HTML XML 我相信这在JaCoCo 官方文档 特别是有jacoco maven plug
  • Jacoco 执行文件始终出现 EOFException

    我尝试为 Sonarqube 生成 Jacoco 报告 生成文件 jacoco exec 可以工作 但在 Eclipse 的 EclEmma 中将其用于 Sonarqube 或会导致 EOFException 因此这两种实现都很糟糕 或者生
  • JaCoCo 和 Gradle - 过滤选项

    我目前正在使用 Gradle 插件来运行 JaCoCo 来进行代码覆盖率报告 我想在我的 build gradle 中指定一些过滤选项 https github com jacoco jacoco wiki FilteringOptions
  • 执行 com.android.build.gradle.internal.coverage.JacocoReportTask$JacocoReportWorkerAction 时发生故障

    我想为我的项目生成代码覆盖率 所以我添加了 debug testCoverageEnabled true 当我运行命令时gradlew createDebugCoverageReport我收到以下错误 Execution failed fo
  • Jacoco 和 Sonar 代码覆盖率?

    Using JaCoCo 0 5 3 Maven2 声纳 2 14 声纳 maven 插件 1 8 S artGWT 3 0 目前正在尝试 在 Sonar 上获取我的 Selenium 单元测试的代码覆盖率 问题 尽管传感器正确启动 代码覆
  • 从 Jenkins 中的 Jacoco 覆盖范围中排除包

    由于我的 Jenkins 管道失败 尝试从覆盖率报告中排除包 我有一个包含所有 POJO s 的子项目 我不想为所有这些编写 uittest 因此 他们会降低分支 线路覆盖率 使覆盖率低于阈值并使我的构建失败 应该可以排除一些软件包 但我无
  • 使用逻辑或 (||) 测试 if 语句的覆盖率 - 使用 Java 的短路,JaCoCo 希望我覆盖的第四个条件是什么?

    这可能是一个相当简单的问题 但我不知所措 我有一个 if 语句 如下所示 if TheEnum A equals myEnum TheEnum B equals myEnum TheEnum can be A B C G 不仅仅是 4 个选
  • JaCoCo:缺少类目录

    我对 JaCoCo 相当陌生 在生成代码覆盖率报告时遇到问题 这是我的项目结构 我的集成测试位于 integration tests 模块中 当我使用 mvn 构建项目时 我在日志记录中收到以下内容 INFO Skipping JaCoCo
  • Gradle 跳过 jacoco 覆盖率插件

    我知道在 stackexchange 上有很多类似的问题 但这让我发疯 任何其他答案都没有帮助我 我几乎使用了我能找到的所有 gradle 强制标志 我的 Gradle 版本是 2 2 1 我的构建 gradle buildscript e
  • jacoco 的准备代理不生成 jacoco.exec 文件

    我正在运行 Jacoco 的 Maven 插件 这prepare agent目标运行良好 但不生成jacoco exec由于某种原因归档 随后report目标抱怨Skipping JaCoCo execution due to missin
  • 在 Scala 的类字段中查找合成成员

    我在 scala 中使用以下方法来获取类中的所有字段 val fields contract getClass getDeclaredFields toList map value gt value setAccessible true v
  • SonarQube 分支机构覆盖范围

    是否可以获取 SonarQube 中非主分支的代码覆盖率详细信息 我看到的其他分支的唯一两个选项卡是Issues and Code 我为每个分支运行相同的 Gradle JaCoCo Sonar 命令 gradlew report sona

随机推荐

  • 何时使用抽象类作为类型

    因此 在尝试理解抽象类时 我仍然对一件事感到困惑 你什么时候想要声明其抽象类的对象类型 例如 public abstract class GameObject public abstract void draw public static
  • 根据 Pandas 中的条件添加行

    我有一个 pandas 数据框 如下所示 Index Year Month Fruit Count 0 2021 03 Apple 2 1 2021 03 Orange 3 2 2021 03 Mango 4 3 2021 04 Apple
  • 线程在notifyall()之后没有返回

    我是 Java 多线程的新手 我做了一些研究 阅读了教程 并做了测试 但我仍然遇到这个问题 基本上 我正在设置游戏的骨架 我想要主活动类 一个包含方法的线程类 执行缓慢的操作 读取文件并将内容解压到缓冲区 并有一个线程是游戏循环对 UI 操
  • 未捕获的语法错误:main.546ac9e6.chunk.js:1 中出现意外的标记“<”[已关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我们有这个使用 create react app 构建并部署的 Web 应用程序 现在我们在控制台中收到此错误 Uncaught SyntaxError Unexpected token
  • PHP 会话变量未定义

    我有这个会话变量 当用户使用以下命令登录时 我试图将其设置为访问级别 accessquery mysql query SELECT roleid FROM person WHERE email email access mysql fetc
  • 如何在 JavaScript 中判断日期是否是周末

    如果我有一个约会要参加某个活动 我如何判断这是否是周末 var dayOfWeek yourDateObject getDay var isWeekend dayOfWeek 6 dayOfWeek 0 6 Saturday 0 Sunda
  • Facebook SDK didLoad:结果 = null

    我有一个 Facebook 单例并请求它来获取个人资料图片 FacebookScorer sharedInstance facebook requestWithGraphPath me picture type normal andDele
  • 在有界泛型类型上使用 Partial 时出现问题

    function f
  • 如何按2个数据属性对div进行排序?

    如何修改我的代码 以便它同时按数据状态和数据顺序排序 即期望的结果是1 2 3 4 我需要支持IE document body on click sortthem function var divList sortme divList so
  • 静态嵌套类可以访问外部类的私有构造函数

    It is stated that 静态嵌套类与其外部的实例成员交互 类 和其他类 就像任何其他顶级类一样 在 结果 静态嵌套类在行为上是一个顶级类 为了打包方便 已经嵌套在另一个顶级类中 那么如何解释这个静态嵌套类可以访问其封闭类的私有构
  • 如何在jmeter中使用jsr 223预处理器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有人请帮助我如何使用脚本编写jsr223预处理器在Jmeter和一些examples 任何最好的网站tutorial对于相同的 提前致谢 SIJO
  • Python 3.2 中 __hash__ 是如何实现的?

    我想使自定义对象可哈希 通过酸洗 我能找到 hash Python 2 x 的算法 参见下面的代码 但显然differs来自 Python 3 2 的哈希 我想知道为什么 有谁知道如何 hash 在Python 3 2 中实现 Versio
  • 我如何获得通用参数的类别[重复]

    这个问题在这里已经有答案了 可能的重复 使用反射获取java中泛型参数的类型 如何获取泛型的类 我如何获取通用参数的类 public
  • 为什么 console.log 显示不正确的对象值?

    我不明白为什么console log显示d1包含 100 200 300 在我介绍这些数字之前 常规的for loop显示内部结构d1虽然正确 有人可以解释一下这个行为 错误吗console log在谷歌浏览器中 https jsfiddl
  • 如果 XML 文件为空,则捕获 PHP 错误

    所以我从 XML 文件中获取一些信息 如下所示 url http myurl blah xml simplexml load file url 除了有时 XML 文件是空的 我需要代码正常失败 但我似乎不知道如何捕获 PHP 错误 我试过这
  • Math.random() === Math.random() 是否可能

    在 JavaScript 中 这个表达式在任何浏览器中都会计算为 true 吗 为什么或者为什么不 Math random Math random 注意 请请按字面意思理解上面的代码 我不是问 Math random 是否会生成重复值 注意
  • crm 2016 在线不支持 SetParameter("fetchXml", FetchXml)

    我有这个代码 function FilterCasesSubgrid var CasesSubgrid Xrm Page getControl contact getGrid var CasesSubgrid window parent d
  • XPages ValuePicker 仅限 1000 个

    我使用 valuePicker 和 DojoListTextBox 设计元素 如果我有超过 1 000 个值 则此值选择器最多列出 1 000 条记录 如何增加这个限制 我只是想让它列出我有多少个值
  • AES 填充无效且无法删除

    我正在使用 AES 加密算法来加密和解密项目中的值 我的代码几乎每次都能工作 但有时我会得到Padding is invalid and cannot be removed错误 我的项目是 ASP NET Core 3 1 项目 它发布在
  • 在运行集成测试之前,如何让 Maven 构建等待 Jetty 服务器以分叉模式启动?

    我有一份关于代码覆盖率的报告一体化 test 我确实有集成测试 并且这些测试在 Maven 构建中成功运行 当我单击 HTML 报告右上角的 会话 链接时 我可以在列表中看到我的测试类 但我看不到现在由测试执行的主要类 并且所有覆盖率报告百