为什么failafe插件需要集成测试和验证目标?

时间:2014-10-10 16:54:33

标签: maven integration-testing maven-failsafe-plugin

我有下一个 pom.xml

<project>
   ...
     <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                    <configuration>
                        <argLine>${failsafeArgLine}</argLine>
                        <includes>
                            <include>**/dmg/*IT.java</include>
                        </includes>
                        <skipTests>${skipTests}</skipTests>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    ...
</project>

问题在于,当我取消验证目标时,即使有测试失败,构建也会每次都成功。

当我取消集成测试目标时,集成测试根本无法运行

为什么failsafe插件需要集成测试和验证目标?

2 个答案:

答案 0 :(得分:7)

在Maven Failsafe插件参考中,您可以找到简单的答案,为什么构建总是成功

failsafe:integration-test runs the integration tests of an application.
  failsafe:verify verifies that the integration tests of an application passed.

如果没有验证目标测试结果根本没有检查(但它们已被执行),因此failafe插件需要集成测试目标来运行测试,并验证&#34;验证&#34;他们的结果。

答案 1 :(得分:1)

在Maven中,有两种类型的测试运行程序插件,Surefire和Failsafe,它们都具有不同的用途。 (我在这里提到Surefire是因为我认为它有助于解释和对比构建中不同类型的失败。)

Surefire

Surefire是为您的部署前测试(例如单元和组件测试)设计的插件。如果任何测试失败,则保证 Surefire返回失败(并因此破坏您的构建)。 您希望在部署前测试中出现这种情况,因为如果测试失败,您想尽早使构建失败,并且由于单元和组件测试没有(或不应)具有任何外部依赖关系,因此安全在那之后使构建失败。

故障保护

Failsafe是一个用于部署后测试(例如功能测试和冒烟测试)的插件。 顾名思义,Failsafe通过始终返回成功退出代码(如您在构建中所经历的那样)来安全地处理故障 。 其背后的原因是对于部署后的测试,您不希望测试失败立即 破坏构建,因为您可能已经加快了基础架构的运行速度,或者将一些测试数据植入了种子中系统,需要在构建失败之前进行清理。 因此,故障安全将故障检查分为failsafe:verify阶段发生的verify目标。

如果运行不带参数的Maven(假设正常的jar生命周期),您会注意到integration-testverify之间的一个阶段。 阶段是为拆除可能已注入系统以运行测试的任何基础架构或测试数据而设计的。

post-integration-test

... pre-integration-test, integration-test, post-integration-test, verify, ... integration-test之前的阶段是为上述播种和基础架构创建而设计的。

总而言之,您希望通过部署前测试尽早使构建失败,因此pre-integration-test通过退出失败来保证这一点。

与部署后测试相比,通常存在外部依赖项,需要在构建失败之前进行清理。例如,在Kubernetes中,您可能要发布部署的回滚,因此surefire总是返回构建成功,以确保您可以通过使用failsafe:integration检查状态来在构建失败之前执行清理。

(当前接受的答案只是引用了手册,并没有解释为什么有两个命令并且存在差异,这就是为什么我觉得需要这个答案。)