在多模块 Maven 项目中构建所有模块后,如何运行集成测试?
Posted
技术标签:
【中文标题】在多模块 Maven 项目中构建所有模块后,如何运行集成测试?【英文标题】:How can I run integration tests after building all modules in a multi-module Maven project? 【发布时间】:2017-01-29 11:25:37 【问题描述】:我正在开发一个大型多模块 Maven 项目。每个模块都有快速的单元测试(使用 Surefire 插件),许多模块的集成测试很慢(使用 Failsafe 插件)。
我想通过在所有模块都已构建和单元测试后运行所有模块的集成测试来加快对“简单”构建失败(编译错误和单元测试失败)的反馈。
您能提出一个实现这一目标的好方法吗?
【问题讨论】:
【参考方案1】:简短的回答可能是将故障安全插件移动到配置文件中。
由于 maven 本身没有 default mapping for the failsafe plugin 我假设它在您的父 pom 或(更糟?)公司父 pom 中启用。
方法是创建一个配置文件以启用集成测试,并且仅在需要时启用该配置文件。为避免浪费,此配置文件可能会禁用 surefire-tests 以不重新执行它们。如果它们无论如何都很快,那可能不是问题。在这种情况下,重新执行它们以启动。
我认为可以将其提取到个人资料中。我对 maven 配置文件的一般规则是不允许他们更改生成的工件(他们可以,但通常会变得混乱)。在这种情况下,您添加另一个执行步骤。所以这不应该伤害。只需确保在剪切版本时启用配置文件即可:)
【讨论】:
但在这种情况下,我们将在运行集成测试时重新编译——这是否正确(或者,至少运行所有检查以查看是否需要编译和依赖项下载)?我会检查一下这增加了构建的时间。谢谢。 是的,直到集成测试的所有阶段都将再次运行。所以也要编译(代码生成,资源处理)。如果这需要一段时间,无论出于何种原因,我都会选择另一个答案:)(请记住,当测试位于代码本身之外的其他地方时,测量 IT 的代码覆盖率有点麻烦)【参考方案2】:在所有模块构建和单元测试后从所有模块运行集成测试
为了满足这个要求,一个可能的解决方案是增加一个(可选)模块来提供集成测试,也就是说,所有的集成测试都应该移到这个模块中,可以通过配置文件添加到默认构建中。
<profiles>
<profile>
<id>it</id>
<modules>
...
<module>it-module</module>
</modules>
</profile>
</profiles>
为了将其作为Maven Reactor 构建的最后一步,该模块还应依赖于所有其他模块(可能隐含地已经如此)。
这个模块实际上是唯一提供maven-failsafe-plugin
配置和设置的模块。此外,如果使用嵌入式服务器进行测试(即 Jetty),它可能会变得更有意义:服务器将仅在此模块的构建期间创建和关闭,而不是在每个需要它的模块中,加速进入这个整合阶段。
作为构建的最后一个模块,您将确保只有在以前的模块上没有单元测试失败的情况下并且只有当it
配置文件处于活动状态时(例如在 CI 构建期间)才能访问它。
【讨论】:
谢谢。我不是这个想法的忠实拥护者,因为我们的大多数集成测试自然地局限于单个模块(或它们的一小部分),而不是运行所有模块的端到端测试。我想我们可以引入并行模块——每个现有模块一个集成测试模块;但我不愿意在构建中增加这么多复杂性。【参考方案3】:这是一个完全符合我要求的解决方案:使用 Failsafe 插件只运行集成测试,而无需将测试移出其自然位置或重新编译以运行测试。
mvn install -DskipITs
mvn failsafe:integration-test
我们让 Maven 将项目的工件发布到本地目录中。然后我们可以将其用作第二步的存储库。然后在第二步中,我们准确地调用我们需要的目标,并从本地存储库中获取工件。
如果您需要单独运行单元测试,同样适用于 Surefire (mvn surefire:test
)。
我不得不承认我并不完全了解 Maven 模型,因此也不了解它的工作原理。互联网似乎一致认为这种事情是做不到的(请参阅此处的其他答案),但这绝对对我有用。
【讨论】:
这也不执行单元测试,对吧?如果您这样做,最好默认跳过集成测试(在父 POM 中设置插件配置)并随时手动执行它们。 @VivekChavda 谢谢。我已经修正了使用-DskipITs
的说明。以上是关于在多模块 Maven 项目中构建所有模块后,如何运行集成测试?的主要内容,如果未能解决你的问题,请参考以下文章
在多模块 Java/scala 项目中有一个通用的 webapp?