您可以使用JUnit类别和Maven轻松拆分它们。
下面通过拆分单元测试和集成测试非常非常简要地显示了这一点。
定义标记接口
使用类别对测试进行分组的第一步是创建标记界面。
此接口将用于将要运行的所有测试标记为集成测试。
public interface IntegrationTest {}
标记您的测试班
将类别注释添加到测试类的顶部。它采用新界面的名称。
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
配置Maven单元测试
该解决方案的优点在于,对于单元测试而言,什么都没有真正改变。
我们只需向maven surefire插件添加一些配置即可使其忽略任何集成测试。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
</configuration>
</plugin>
当您执行mvn clean测试时,只会运行未标记的单元测试。
配置Maven集成测试
同样,此配置非常简单。
要仅运行集成测试,请使用以下命令:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.11</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.12</version>
</dependency>
</dependencies>
<configuration>
<groups>com.test.annotation.type.IntegrationTest</groups>
</configuration>
</plugin>
如果将其包装在ID为ID的配置文件中IT
,则只能使用进行快速测试mvn clean install
。要仅运行集成/慢速测试,请使用mvn clean install -P IT
。
但最常见的情况是,您默认需要运行快速测试,并使用运行所有测试-P IT
。如果真是这样,那么您必须使用一个技巧:
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
如您所见,我排除了带有注释的测试java.io.Serializable
。这是必需的,因为配置文件将继承Surefire插件的默认配置,因此即使您说<excludedGroups/>
或<excludedGroups></excludedGroups>
,com.test.annotation.type.IntegrationTest
也将使用该值。
您也不能使用none
它,因为它必须是类路径上的接口(Maven会对此进行检查)。
笔记:
surefire-junit47
仅当Maven不会自动切换到JUnit 4运行程序时才需要对的依赖。使用groups
或excludedGroups
元素应触发切换。看这里。
- 上面的大多数代码来自Maven Failsafe插件的文档。请参阅本页上的 “使用JUnit类别”部分。
- 在我的测试过程中,我发现当您使用
@RunWith()
批注运行套件或基于Spring的测试时,这甚至也可以使用。