我正在开发一个大型的多模块Maven项目。每个模块都有快速的单元测试(使用Surefire插件),许多模块的集成测试都很慢(使用Failsafe插件)。在多模块Maven项目中构建所有模块后,如何运行集成测试?
我想通过在所有模块构建并进行单元测试后运行来自所有模块的集成测试,加快“简单”构建失败(编译错误和单元测试失败)的反馈。
你能提出一个实现这个目标的好方法吗?
我正在开发一个大型的多模块Maven项目。每个模块都有快速的单元测试(使用Surefire插件),许多模块的集成测试都很慢(使用Failsafe插件)。在多模块Maven项目中构建所有模块后,如何运行集成测试?
我想通过在所有模块构建并进行单元测试后运行来自所有模块的集成测试,加快“简单”构建失败(编译错误和单元测试失败)的反馈。
你能提出一个实现这个目标的好方法吗?
下面是一个解决方案,它完全符合我的要求:使用Failsafe插件仅运行集成测试,无需将测试移出自然场所或重新编译以运行测试。
mvn install -DskipITs
mvn failsafe:integration-test
我们得到Maven发布工程的工件到本地目录。然后,我们可以使用它作为第二步的存储库。在第二步中,我们将调用我们需要的目标,并从本地存储库中抓取工件。
同样的事情适用于神火(mvn surefire:test
),如果你需要单独运行单元测试。
我不得不承认,我没有完全理解Maven模型,因此它的工作原理。互联网似乎一致认为这种事情是无法完成的(见这里的其他答案),但它绝对是为我工作的。
简短的回答可能是将故障安全插件移动到配置文件中。
由于maven本身并不带有default mapping for the failsafe plugin我认为它在您的父pom或(更糟?)公司父pom中启用。
方法是创建配置文件以启用集成测试,并仅在需要时启用该配置文件。为了避免浪费,此配置文件可能会禁用surefire测试,以免重新执行它们。如果他们反正很快,那可能不是问题。在这种情况下,重新执行它们以启动。
我认为可以将其提取到配置文件中。我对maven配置文件的一般规则是,他们不允许更改产生的工件(他们可以,但通常会变得杂乱)。在这种情况下,您添加另一个执行步骤。所以这不应该伤害。只需确保文件中启动切割释放时:)
但是在这种情况下运行的集成测试时,我们会重新编译 - 是正确的(或至少通过所有的检查运行是否需要编译和依赖下载)?我会检查一下这会增加多少时间。谢谢。 –
yes直至集成测试的所有阶段都将再次运行。所以也编译(代码生成,资源处理)。如果因为某种原因需要一段时间,我会与其他答案一起去:)(请记住,当测试位于代码本身之外时,测量IT代码覆盖率有点麻烦) – wemu
所有模块的运行集成测试后,所有的模块已建成和单元测试
为了满足这一要求的可能解决方案是有一个额外的(可选)模块提供集成测试,也就是说,所有的集成测试都应该移到这个模块中,这个模块可以通过配置文件添加到默认构建中。
<profiles>
<profile>
<id>it</id>
<modules>
...
<module>it-module</module>
</modules>
</profile>
</profiles>
为了把它作为构建的Maven Reactor的最后一步,该模块还应该依赖于所有其它模块(可能会隐含已经是这种情况)。
该模块实际上是唯一提供maven-failsafe-plugin
配置和设置的模块。此外,在使用嵌入式服务器进行测试时(例如Jetty),它可能会变得更有意义:服务器将仅在构建该模块期间创建并关闭,而不是在每个需要它的模块中进行加速完成这个整合阶段。
作为构建的最后一个模块,只有在以前的模块上没有单元测试失败的情况下,并且只有当it
配置文件处于活动状态时(例如在CI构建期间),才能确保达到该状态。
谢谢。我不是这个想法的忠实粉丝,因为我们的大多数集成测试自然被限定为单个模块(或其中的一小部分),而不是执行所有模块的端到端测试。我想我们可以引入并行模块 - 每个现有模块都有一个集成测试模块;但我不愿意为构建增加这么多的复杂性。 –
这不会执行单元测试,对吧?如果你这样做,默认情况下跳过集成测试可能会更好(在父POM中设置插件配置),并在任何时候手动执行它们。 –
@VivekChavda谢谢。我修复了使用'-DskipITs'的说明。 –