在多模块 Maven 项目中构建所有模块后,如何 运行 进行集成测试?

How can I run integration tests after building all modules in a multi-module Maven project?

我正在处理一个大型多模块 Maven 项目。每个模块都有快速单元测试(使用 Surefire 插件),许多模块有慢速集成测试(使用 Failsafe 插件)。

我想通过 运行 在所有模块构建和单元测试后对所有模块进行集成测试来加快对 "simple" 构建失败(编译错误和单元测试失败)的反馈.

您能提出一个实现此目的的好方法吗?

简短的回答可能是将故障保护插件移动到配置文件中。

因为 Maven 本身没有 default mapping for the failsafe plugin 我假设它在你的父 pom 或(更糟?)公司父 pom 中启用。

方法是创建一个配置文件以启用集成测试,并且仅在需要时启用该配置文件。为避免浪费,此配置文件可以禁用 surefire-tests 以不重新执行它们。如果他们无论如何都很快,那可能不是问题。在那种情况下重新执行它们以启动。

我认为可以将其提取到配置文件中。我对 Maven 配置文件的一般规则是不允许他们更改生成的工件(他们可以,但通常会变得混乱)。在本例中,您添加了另一个执行步骤。所以这不应该受到伤害。只需确保在剪切版本时启用配置文件:)

running integration tests from all modules after all modules have been built and unit-tested

为了满足这个要求,一个可能的解决方案是有一个额外的(可选)模块提供集成测试,也就是说,所有集成测试都应该移到这个模块,可以通过配置文件添加到默认构建。

<profiles>
   <profile>
      <id>it</id>
      <modules>
        ...
        <module>it-module</module>
      </modules>
   </profile>
</profiles>

为了将其作为 Maven Reactor 构建的最后一步,该模块还应依赖于所有其他模块(可能已经隐式如此)。

该模块实际上是唯一提供 maven-failsafe-plugin 配置和设置的模块。此外,如果使用嵌入式服务器进行测试(即 Jetty),它可能会变得更有意义:服务器将仅在构建此模块期间创建和关闭,而不是在每个需要它的模块中,加速在这个整合阶段。

作为构建的最后一个模块,您将确保仅在先前模块没有单元测试失败且仅当 it 配置文件处于活动状态时(例如在 CI 建造)。

这是一个完全符合我要求的解决方案:使用 Failsafe 插件 运行 仅进行集成测试,而无需将测试移出它们的自然位置或重新编译以 运行测试。

mvn install -DskipITs
mvn failsafe:integration-test

我们让 Maven 将项目的工件发布到本地目录中。然后我们可以将其用作第二步的存储库。在第二步中,我们然后准确地调用我们需要的目标,它从本地存储库中获取工件。

如果您需要单独 运行 单元测试,同样的事情适用于 Surefire (mvn surefire:test)。

我不得不承认,我并不完全理解 Maven 模型,因此也不完全理解它为何有效。互联网似乎一致认为这种事情无法完成(请参阅此处的其他答案),但它确实对我有用。