8

我有下一个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>

问题是当我起飞时验证目标时,即使测试失败,每次构建都是成功的。

当我开始集成测试时目标时,集成测试根本不会运行

为什么故障安全插件需要集成测试和验证目标?

4

2 回答 2

12

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

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

如果没有验证目标,则根本不检查测试结果(但它们会被执行),因此故障安全插件需要集成测试目标来运行测试,并验证以“验证”它们的结果。

于 2014-10-10T17:04:53.797 回答
5

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

万无一失

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

故障保护

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

如果你在没有参数的情况下运行 Maven(假设是正常的jar生命周期),你会注意到 和 之间的一个integration-test阶段verifypost-integration-test. 阶段旨在拆除您可能已注入系统以运行测试的任何基础架构或测试数据。

... pre-integration-test, integration-test, post-integration-test, verify, ...

integration-test之前的阶段pre-integration-test是为上述播种和基础设施创建而设计的。

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

而在部署后测试中,通常有外部依赖项需要在构建失败之前进行清理。例如,在 Kubernetes 中,您可能希望发布部署回滚,因此failsafe:integration始终返回构建成功,以确保您可以在构建失败之前通过检查状态来执行清理failsafe:verify

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

于 2020-08-08T14:45:59.900 回答