运行彼此隔离的集成测试

时间:2015-12-11 14:33:21

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

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

我在"整合"中得到了一些硒测试(在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 init的一部分......

<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>

2 个答案:

答案 0 :(得分:0)

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

  1. 使用Tomcat容器Java API(而不是使用Maven插件,而不是使用Maven插件,设置/拆除您的Web应用程序,例如Cargo支持Tomcat并拥有Java API(启动here,但我怀疑这一点会很容易,但可能值得))。这将允许您使用Before / After方法动态设置和拆除Web应用程序,并为您提供您正在寻找的控件(您可以重复使用相同的Web容器并重新安装应用程序,重新初始化数据库等,或者你可能会把一切都拆掉并重新开始,你的电话)。这甚至可以允许您一次运行Web应用程序的多个实例(假设您可以使用app执行此操作),然后单独并行运行集成测试。
  2. 使用maven插件安装可从不同基本网址和/或端口访问的应用的多个实例。

答案 1 :(得分:0)

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

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

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

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

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