2

两者( FailsafeInvoker )的文档表明它们对于运行集成测试很有用。我无法弄清楚将哪一个用于集成测试。

我能看到的唯一区别是 Failsafe 插件是专门为运行集成测试而设计的,而 Invoker 插件恰好对运行集成测试很有用,但它的主要目的是别的。但是,当我在 Eclipse 中创建 maven-plugin 时,Maven Invoker Plugin 已经包含在 POM 文件中,代码如下。

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-invoker-plugin</artifactId>
        <version>1.7</version>
        <configuration>
            <debug>true</debug>
            <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
            <pomIncludes>
                <pomInclude>*/pom.xml</pomInclude>
            </pomIncludes>
            <postBuildHookScript>verify</postBuildHookScript>
            <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
            <settingsFile>src/it/settings.xml</settingsFile>
            <goals>
                <goal>clean</goal>
                <goal>test-compile</goal>
            </goals>
        </configuration>
        <executions>
            <execution>
                <id>integration-test</id>
                <goals>
                    <goal>install</goal>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>                 

它们之间的主要区别是什么?在集成测试中是否存在应该优先于其他的特定情况?

4

1 回答 1

8

用例确实不同。您可以将其maven-invoker-plugin视为 Failsafe 插件的特定子集,旨在用于测试您的自定义 Maven 插件,尽管它的用途可能更广泛。

故障保护插件

与(实际上它们都在项目maven-failsafe-plugin下)齐头并进:它用于在Java代码中编写测试。Surefire 和 Failsafe Plugin 的区别在于第一个用于编写单元测试,而另一个用于编写集成测试。maven-surefire-pluginsurefire

与单元测试相反,集成测试是需要存在环境的测试。环境是一个很大的术语,但它包含了测试运行所需的所有其他工具。例如,如果您想要运行依赖于 Web 服务器或数据库存在的应用程序测试,它通常是集成测试。

Maven 通过具有特定阶段来将此定义集成到default生命周期中,以便设置测试所需的环境、运行测试和破坏环境:

Maven 生命周期有四个运行集成测试的阶段:

  • pre-integration-test用于设置集成测试环境。
  • integration-test用于运行集成测试。
  • post-integration-test用于拆除集成测试环境。
  • verify用于检查集成测试的结果。

一个示例是在 中设置和启动 Web 服务器,在 中pre-integration-test测试 HTTP 调用,integration-test最后在 中停止 Web 服务器post-integration-test

请注意,本例中的集成测试是用 Java 编写的,并且位于src/test/java. 有一个命名约定可以将它们与单元测试区分开来。因此,您正在编写测试代码。

调用者插件

你是对的,它的主要用例不是运行集成测试。它的设计目的是在构建期间调用其他 Maven 项目。当您想针对其他 Maven 项目运行测试时,该特定用例非常有用。

这个插件对于执行其他 Maven 插件的集成测试特别方便。Invoker Plugin 可用于运行一组测试项目,这些项目旨在断言被测插件的某些功能。

假设您正在开发一个 Maven 插件,并且您想测试它的行为是否正确。您可以使用 Surefire 插件编写测试来执行其功能的基本测试,即不需要作为一个整体运行您的插件的功能。

您甚至可以使用 Failsafe 插件编写集成测试,这将是针对 Maven 测试项目执行插件完整运行并检查其输出的测试。但这很快就会变得很麻烦:使用自定义 Maven 插件在磁盘上创建 Maven 项目并让 Invoker Plugin 调用这个项目会更容易。然后您可以测试运行是否正确。

总的来说,要测试您的 Maven 插件,您甚至不需要编写任何 Java 代码:您只需在目录中使用您的插件创建测试 Maven 项目,让 Invoker 插件调用它,然后使用用 BeanShell 或 Groovy 编写的后期构建脚本。这些是集成测试,因为它们需要一个运行环境(主要是 Maven 本身),但您并没有真正编写它们。

这可能是 Eclipse 为您生成此文件的原因:您创建了一个 Maven 项目 Packaging maven-plugin,因此它会将您引导至 Invoker Plugin 以对其进行测试。

于 2016-10-13T09:39:59.940 回答