为了有用,自动测试应该运行得非常快。
否则,将不会在开发期间经常运行,甚至在开发人员工作站的默认配置中将被忽略。
最简单的规则是仅编写小型单元测试,该测试将模拟给定类的邻居。
但是,有时在IoC容器上下文(Spring,CDI,Guice)或使用嵌入式数据库(H2,HyperSQL,Derby)中测试某些东西很有用/必需。
不幸的是,即使是这种类型的测试,也可能显着增加总体测试执行时间。
我在一个项目中遇到这种情况,并且为了避免使用skipTests标志,我使用了TestNG和Maven Surefire插件中的组开发了一种解决方案。
测试分为三组:
- 非常快速的真实单元测试(默认情况下全部为)–在开发过程中应经常运行(通过IDE或通过mvn测试,mvn软件包)
- 集成速度较慢,但自给自足的测试(设置Spring上下文和/或使用嵌入式H2数据库)–至少应在提交/推送之前或在给定部件上运行时运行(通过IDE或通过mvn集成测试,mvn安装)
- 真正的集成测试(要求访问远程服务器,例如测试Web服务或REST)应每天由CI服务器或从事集成工作的开发人员运行(mvn安装,mvn集成测试并启用其他配置文件)
为了实现给定的测试(或测试类),必须将其标记为“自集成”或“集成”(在方法或类级别):
@Test(groups = "self-integration")
public void shouldInitializeChainedAppInfoProperly() {
@Test(groups = "integration")
public class FancyWebServiceIntegrationTest {
Maven Surefire插件应配置为从默认执行中排除“自集成”和“集成”测试组,并在“集成测试阶段”添加“自集成”:
<build>
<plugins>
(...)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${ver.surefire-plugin}</version>
<executions>
<execution>
<id>default-test</id> <!-- to override default configuration - in fact: unit tests -->
<configuration>
<excludedGroups>self-integration,integration</excludedGroups>
</configuration>
</execution>
<execution>
<id>self-integration</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<groups>self-integration</groups>
<reportsDirectory>target/self-integration-surefire-reports/</reportsDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
另外(如果需要),可以创建在“集成测试”阶段配置的带有“集成”测试组的单独的单独配置文件。
<profiles>
(...)
<profile>
<id>integration</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${ver.surefire-plugin}</version>
<executions>
<execution>
<id>integration</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<groups>integration</groups>
<reportsDirectory>target/integration-surefire-reports/</reportsDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
可以在AppInfo的人工分支(pom.xml和示例测试类)中找到工作示例。 根据您的需求很容易采用它。
三个测试组都有各自独立的报告格式,以免彼此覆盖。 作为扩展,可能可以将它们合并到一个汇总的测试报告中。
参考: 跑得快单元测试的时候,慢整合很少- TestNG的和Maven配置指南从我们JCG伙伴马尔钦Zajaczkowski在固态软博客。
翻译自: https://www.javacodegeeks.com/2012/04/testng-and-maven-configuration-guide.html