【问题标题】:Run Integration tests isolated from each other运行彼此隔离的集成测试
【发布时间】:2015-12-11 14:33:20
【问题描述】:

有没有办法独立运行集成测试?

我在“集成”组中进行了一些硒测试(在 java 中重新设计),在预集成测试阶段,tomcat 运行 webapp,在集成后测试它关闭。但问题是我需要测试彼此独立。例如,当第一次测试运行时,它会在这里和那里创建一些帖子。在运行第二个测试(在默认的 webapp 上)之前,我需要重置 webapp(清理第一个测试所做的一切)。所有这些都需要自动进行......

这是我来自 pom.xml 的故障安全插件配置。

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19</version>
    <configuration>
        <groups>integration</groups>
    </configuration>
    <executions>
        <execution>
            <id>integration-test</id>
            <goals>
                <goal>integration-test</goal>
            </goals>
        </execution>
        <execution>
            <id>verify</id>
            <goals>
            <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这是集成阶段和 tomcat 初始化的部分...

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.190</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>run</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
                <webapps>
                    <webapp>
                        <groupId>...webapp...</groupId>
                        <artifactId>...webapp...</artifactId>
                        <version>${webapp.version}</version>
                        <type>war</type>
                        <asWebapp>true</asWebapp>
                        <contextPath>/</contextPath>
                    </webapp>
                </webapps>
                <fork>true</fork>
                <port>${tomcat.port}</port>
            </configuration>
        </execution>
        <execution>
            <id>tomcat-shutdown</id>
            <goals>
                <goal>shutdown</goal>
            </goals>
            <phase>post-integration-test</phase>
        </execution>
    </executions>
</plugin>

【问题讨论】:

    标签: maven tomcat testng integration maven-failsafe-plugin


    【解决方案1】:

    不幸的是,我不知道有任何工具可以简化这一点,并且解决方案将非常特定于您使用的技术(例如 Tomcat/Jetty/etc.、Jersey/Spring/etc.、H2/MySQL/etc.等)但这里有两个选项:

    1. 使用 Tomcat Container Java API(而不是使用 Maven 插件,例如 Cargo 支持 Tomcat 并具有 Java API(开始 here 虽然我怀疑这将是容易但可能值得))。这将允许您使用 Before/After 方法即时设置和拆除 Web 应用程序,并为您提供所需的控制(您可以重复使用相同的 Web 容器并重新安装应用程序,重新初始化数据库等,或者您可能会删除所有内容并重新开始,您的电话)。这甚至可以让您一次运行 Web 应用的多个实例(假设您可以使用应用执行此操作),然后并行独立地运行集成测试。
    2. 使用 maven 插件安装应用程序的多个实例,可从不同的基本 URL 和/或端口访问。

    【讨论】:

    • 谢谢,我喜欢实现 Maven 插件的想法,它会在 AfterClass 中的每次测试后关闭应用程序。我会尝试一下,但我认为这对我来说有点复杂......
    【解决方案2】:

    从技术上讲,您需要添加多个执行,每个执行都需要重新启动应用服务器、部署应用并运行测试。您将无法通过标准 Maven 方式来做到这一点。虽然你总是可以编写自己的插件。

    您的方法的问题在于它非常复杂(正如您已经注意到的)并且非常无效,因为您需要进行多次部署。我建议改变方法,这里有一些建议:

    随机化数据以隔离测试。在大多数情况下,可以为测试准备和随机化数据。例如。如果您代表某个用户创建帖子,您可以为该特定测试创建该用户(具有随机名称)并创建一个随机生成的帖子。这样 2 个测试将彼此隔离。这并不总是可行的(例如,您测试应用的全局配置),但在 99% 的情况下是可行的。

    不要编写许多需要实际部署的系统测试(例如使用 Selenium 的系统测试)。在大多数情况下,编写单元测试或组件测试就足够了。例如。初始化几个 Spring 上下文(或您使用的任何 DI)并直接测试服务/控制器。许多 REST 或 MVC 框架能够直接调用服务/控制器而无需实际部署(例如 Spring MVC 具有 MockMvc)。如果您仍想在测试中部署应用程序,请考虑使用Arquillian 而不是 Tomcat,但它仍然会很慢。您需要真正部署的唯一情况是您想要测试 UI - 这需要完整的应用服务器和浏览器。

    一般来说,要获得最佳和隔离的测试,您需要构建一个测试金字塔,在其中您有大量的单元测试、许多组件测试和少量的系统测试(这些测试很难隔离并且需要大量时间)无论如何努力)。请参阅 this article 如何在 Java 应用程序中执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-24
      • 2019-05-06
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多