测试的包含和排除
夹杂物
默认情况下,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