使用 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.11</version>
    <dependencies>
      <dependency>
        <groupId>org.apache.maven.surefire</groupId>
        <artifactId>surefire-junit47</artifactId>
        <version>2.11</version>
      </dependency>
    </dependencies>
  </plugin>
[...]
</plugins>

使用此技术时,不会检查项目的类路径中是否存在正确的测试框架。未能添加正确的测试框架将导致构建失败。

并行运行测试

从 JUnit 4.7 起,您可以并行运行测试。为此,您必须设置parallel参数,并且可以更改threadCountuseUnlimitedThreads属性。例如:

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.11</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.11</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.11</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.11</version>
        <configuration>
          <argLine>-Djava.security.manager -Djava.security.policy=${basedir}/src/test/resources/java.policy</argLine>
        </configuration>
      </plugin>
[...]
</plugins>

这种解决方案的缺点是策略变化也会影响测试,这使得安全环境不太现实。

有关 JUnit 的更多信息,请参阅JUnit 网站