【问题标题】:Maven Invoker Plugin vs Maven Failsafe Plugin: Which to use for integration-test?Maven Invoker Plugin vs Maven Failsafe Plugin:哪个用于集成测试?
【发布时间】:2016-10-13 01:11:43
【问题描述】:

两者(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>                 

它们之间的主要区别是什么?是否存在某种特定情况下应该优先考虑集成测试?

【问题讨论】:

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


    【解决方案1】:

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

    故障保护插件

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

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

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

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

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

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

    请注意,本例中的集成测试是用 Java 编写的,位于 src/test/java 中。有a naming convention 将它们与单元测试区分开来。所以,你正在编写测试代码。

    调用者插件

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

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

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

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

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

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

    【讨论】:

    • 这是一个非常全面的答案!谢谢!一个问题:如果我使用一个(例如,Invoker),我不必使用另一个,对吗?即他们都做同样的工作(集成测试)?
    • @DarshilChauhan 正确,您通常会使用其中一个。对于 Maven 插件,Invoker Plugin 确实是集成测试的首选。
    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多