有没有办法独立运行集成测试?
我在"整合"中得到了一些硒测试(在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>
答案 0 :(得分:0)
不幸的是,我不知道有哪些工具可以简化这一点,并且解决方案将非常特定于您使用的技术(例如Tomcat / Jetty / etc。,Jersey / Spring /等,H2 / MySQL /等)。等等)但这里有两个选择:
答案 1 :(得分:0)
从技术上讲,您需要添加多个执行,每个执行都需要重新启动应用服务器,部署应用并运行测试。您无法通过标准Maven进行操作。虽然你总是可以编写自己的插件。
您的方法存在的问题是它非常复杂(正如您已经注意到的那样)而且非常无效,因为您需要进行多次部署。我建议改变方法,这里有一些建议:
随机化数据以隔离测试。在大多数情况下,可以为测试准备和随机化数据。例如。如果您代表某个用户创建帖子,则可以为该特定测试创建该用户(具有随机名称)并创建随机生成的帖子。这样,2个测试将彼此隔离。它并不总是可能的(例如,您测试应用程序的全局配置),但在99%的情况下它是。
不要写许多需要实际部署的系统测试(比如那些使用Selenium的系统测试)。在大多数情况下,编写单元测试或组件测试就足够了。例如。初始化几个Spring上下文(或您使用的任何DI)并直接测试服务/控制器。许多REST或MVC框架都能够在没有实际部署的情况下直接调用服务/控制器(例如,Spring MVC具有MockMvc)。如果您仍想在测试中部署应用程序,请考虑使用Arquillian而不是Tomcat,但它仍然会很慢。您需要实际部署的唯一情况是您想要测试UI - 这需要一个完整的应用服务器和浏览器。
一般来说,为了获得最佳和孤立的测试,您需要构建一个测试金字塔,您需要进行大量的单元测试,许多组件测试和少量系统测试(很难分离并且需要大量的测试无论如何努力)。请参阅this article如何在Java应用程序中执行此操作。