使用 JUnit
配置 JUnit
要开始使用 JUnit,您需要将所需版本的 JUnit 添加到您的项目中:
<dependencies> [...] <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> [...] </dependencies>
这是开始所需的唯一步骤 - 您现在可以在测试源目录(例如src/test/java)中创建测试。
不同代的 JUnit 支持
Surefire 支持三代不同的 JUnit:JUnit 3.8.x、JUnit 4.x(串行提供程序)和 JUnit 4.7(具有并行支持的 junit-core 提供程序)。根据项目中的 JUnit 版本和配置参数(用于并行)选择提供程序。
JUnit 4.x 的升级检查
从 Surefire 2.7 版开始,选择运行哪些测试的算法发生了变化。从 2.7 开始,所有版本的 JUnit 只运行有效的 JUnit 测试,旧版本的插件也会运行满足命名约定的无效测试。
从 2.7 之前的 Surefire 版本升级时,可以使用标志 -Dsurefire.junit4.upgradecheck 运行构建。这将执行检查并通知您不会使用此版本的 Surefire 运行的任何无效测试(并且构建失败)。这仅在升级时用作工具,以检查是否将运行所有预期的测试。这是一个过渡功能,将在未来版本的 Surefire 中删除。
如何选择供应商?
如果未配置任何内容,surefire 会通过以下算法检测要使用的 junit 版本:
if the JUnit version in the project >= 4.7 and the parallel attribute has ANY value use junit47 provider if JUnit >= 4.0 is present use junit4 provider else use junit3.8.1
请注意,此算法的“else”部分也是常见问题解答:
您依赖于项目依赖项中存在的适当版本的 JUnit,否则肯定会选择错误的提供程序。例如,如果您的一个依赖项引入了 JUnit 3.8.1,那么您就有风险选择 3.8.1 提供程序,它不支持注释或任何 4.x 特性。
使用 mvn 依赖:树、pom 依赖排序和/或排除传递依赖来解决此问题。
手动指定提供者
您还可以通过将其作为依赖项添加到 Failsafe 本身来手动强制特定提供程序:
<plugins> [...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12.4</version> </dependency> </dependencies> </plugin> [...] </plugins>
使用此技术时,不会检查项目的类路径中是否存在正确的测试框架。未能添加正确的测试框架将导致构建失败。
并行运行测试
从 JUnit 4.7 起,您可以并行运行测试。为此,您必须设置parallel参数,并且可以更改threadCount或useUnlimitedThreads属性。例如:
<plugins> [...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> <configuration> <parallel>methods</parallel> <threadCount>10</threadCount> </configuration> </plugin> [...] </plugins>
如果您的测试为“parallel”属性指定了任何值并且您的项目使用 JUnit 4.7+,那么您的请求将被路由到使用 JUnit JUnitCore 测试运行程序的并发 JUnit 提供程序。
这对于可能具有高并发性的慢速测试特别有用。
从 surefire 2.7 开始,不需要额外的依赖项来使用并行的全套选项。
使用自定义侦听器和报告器
JUnit4/4.7 提供程序支持将自定义 RunListener 附加到您的测试。
您可以像这样配置多个自定义侦听器:
<plugins> [...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> <configuration> <properties> <property> <name>listener</name> <value>com.mycompany.MyResultListener,com.mycompany.MyResultListener2</value> </property> </configuration> </plugin> [...] </plugins>
使用安全管理器(仅限 JUnit3)
只要 forkMode!=never 并且您使用 JUnit3,您就可以在 Java 安全管理器处于活动状态时运行您的测试。安全管理器的类名必须作为系统属性变量发送给 JUnit3 提供者。
JUnit4 内部使用的机制与经过测试的安全管理器不兼容,并且不受surefire 支持。
<plugins> [...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> <configuration> <systemPropertyVariables> <surefire.security.manager>java.lang.SecurityManager</surefire.security.manager> </systemPropertyVariables> </configuration> </plugin> [...] </plugins>
使用安全管理器(所有提供者)
或者,您可以定义一个策略文件,该文件允许所有提供程序使用 surefire 运行并使用 argLine 参数和两个系统属性发送它们;
<plugins> [...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12.4</version> <configuration> <argLine>-Djava.security.manager -Djava.security.policy=${basedir}/src/test/resources/java.policy</argLine> </configuration> </plugin> [...] </plugins>
这种解决方案的缺点是策略变化也会影响测试,这使得安全环境不太现实。
使用 JUnit 类别
JUnit 4.8 引入了类别的概念。您可以通过使用groups参数来使用 JUnit 类别。只要项目中的 JUnit 版本为 4.8 或更高版本,“groups”参数的存在就会自动确保surefire 选择支持组的junit47 提供程序。
<plugins> [...] <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.11</version> <configuration> <groups>com.mycompany.SlowTests</groups> </configuration> </plugin> [...] </plugins>
如果类/接口SlowerTests是SlowTests的子类,这将只执行那些带有@Category(com.mycompany.SlowTests.class)注释的测试和那些带有@Category (com.mycompany.SlowerTests.class) 注释的测试:
public interface SlowTests{} public interface SlowerTests extends SlowTests{}
public class AppTest { @Test @Category(com.mycompany.SlowTests.class) public void testSlow() { System.out.println("slow"); } @Test @Category(com.mycompany.SlowerTests.class) public void testSlower() { System.out.println("slower"); } @Test @Category(com.cmycompany.FastTests.class) public void testSlow() { System.out.println("fast"); } }
@Category 注释也可以在类级别应用。
有关 JUnit 的更多信息,请参阅JUnit 网站。