测试的包含和排除
夹杂物
默认情况下,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>
上面的配置将在以下位置搜索测试类:
- 具有 groupId
org.acme和 artifactId的所有依赖项project-a - 具有 groupId
org.acme和 artifactIdproject-b和类型的所有依赖项test-jar - 具有 groupId
org.acme和 artifactIdproject-c和分类器的所有依赖项tests-jdk15



