在 GitHub 上叉我

测试的包含和排除

夹杂物

默认情况下,Surefire 插件会自动包含所有具有以下通配符模式的测试类:

  • "**/Test*.java"- 包括其所有子目录和所有以“Test”开头的 Java 文件名。
  • "**/*Test.java"- 包括其所有子目录和所有以“Test”结尾的 Java 文件名。
  • "**/*Tests.java"- 包括其所有子目录和所有以“Tests”结尾的 Java 文件名。
  • "**/*TestCase.java"- 包括其所有子目录和所有以“TestCase”结尾的 Java 文件名。

如果测试类不遵循任何这些命名约定,则配置 Surefire 插件并指定要包含的测试。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <includes>
            <include>Sample.java</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

排除项

有时某些测试会导致构建失败。排除它们是继续构建的最佳解决方法之一。可以通过配置excludes插件的属性来完成排除。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <excludes>
            <exclude>**/TestCircle.java</exclude>
            <exclude>**/TestSquare.java</exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

正则表达式支持

包含/排除模式可以是 ant 样式的路径表达式,但此语法也支持正则表达式:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <includes>
            <include>%regex[.*(Cat|Dog).*Test.*]</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

注意语法%regex[expr]expr实际表达式在哪里,其余的只是包装。还要注意以下关于正则表达式的使用:

  • 正则表达式匹配是通过*.class文件而不是*.java文件完成的
  • 正则表达式匹配使用斜杠(“ /”)在路径上完成,而不是使用点(“ .”)的包名称,因此“ .”中的“”pkg.*Slow.*.class是一个正则表达式元字符,它恰好匹配任何字符,尤其是(正向)斜杠(“ /”)构成路径。这里的斜线是向前的,即使在 Windows 上也是如此
  • 尾随.class按字面意思解释,而不是正则表达式(“ \.class”在这里不起作用)

多种格式合二为一

从 Surefire 插件 2.19 开始,一个参数(JUnit 4、JUnit 4.7+、TestNG)支持复杂的语法:

  [...]
          <include>%regex[.*(Cat|Dog).*], !%regex[pkg.*Slow.*.class], pkg/**/*Fast*.java, Basic????, !Unstable*</include>
  [...]
          <exclude>%regex[pkg.*Slow.*.class], Unstable*</exclude>
  [...]

此语法可用于参数:test, includes, excludes, includesFile, excludesFile. 感叹号 (!) 不包括测试。参数中的语法,excludes不应excludesFile使用 (!)。非正则表达式模式中的字符 (?) 替换文件名或路径中的一个字符。在非正则表达式模式中,文件扩展名不是强制性的,可以使用带有斜杠的包。正则表达式验证完全限定的类文件。正则表达式仅支持“.class”文件扩展名。请注意,不支持以 (#) 字符标记的正则表达式注释。

完全限定的类名

从 Surefire 插件 2.19.1 开始,可以使用具有完全限定类名或包的语法,例如:

  [...]
          <include>my.package.*, another.package.*</include>
  [...]
          <exclude>my.package.???ExcludedTest, another.package.*ExcludedTest</exclude>
  [...]

字符 (?) 替换单个字符, (*) 表示零个或多个字符。可以额外组合多种格式。此语法可用于参数:test, includes, excludes, includesFile, excludesFile.

依赖项的测试

默认情况下,Surefire 只会扫描测试类以在配置的testSourceDirectory. 要让插件扫描依赖项以查找要执行的测试类,请使用dependenciesToScan配置。可以使用groupId[:artifactId[:type[:classifier][:version]]]格式指定依赖关系,并且必须已经是dependency范围内的元素。

注意:在 version 中引入了对版本、类型和分类器的支持3.0.0-M4。使用早期版本时,IllegalArgumentException如果指定了多个 groupId 和 artifactId,Surefire 将失败。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
          <dependenciesToScan>
            <dependency>org.acme:project-a</dependency>
            <dependency>org.acme:project-b:test-jar</dependency>
            <dependency>org.acme:project-c:*:tests-jdk15</dependency>
          </dependenciesToScan>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

上面的配置将在以下位置搜索测试类:

  • 具有 groupIdorg.acme和 artifactId的所有依赖项project-a
  • 具有 groupIdorg.acme和 artifactIdproject-b和类型的所有依赖项test-jar
  • 具有 groupIdorg.acme和 artifactIdproject-c和分类器的所有依赖项tests-jdk15