此任务允许使用 JUnit 5 框架启动和运行测试。
JUnit 5 引入了编写和启动测试的新 API 集。它还引入了测试引擎的概念。测试引擎决定哪些类被视为测试用例以及如何执行它们。JUnit 5 支持运行使用 JUnit 4 结构编写的测试,以及使用 JUnit 5 结构编写的测试。有关 JUnit 5 本身的更多详细信息,请参阅 JUnit 5 项目的文档:https://junit.java.net.cn/junit5/.
此 junitlauncher
任务的目的是允许启动 JUnit 5 测试启动器并构建测试请求,以便选定的测试可以由 JUnit 5 支持的测试引擎解析和执行。此任务本身不了解什么是测试用例,也不执行测试本身。
此任务在 临时目录 中捕获测试输出和配置数据。
注意:此任务依赖于 Apache Ant 分发版中未包含的外部库。有关更多信息,请参阅 库依赖项。
注意:您必须在测试的类路径中拥有必要的 JUnit 5 库。在撰写本文档时,运行测试所需的 JUnit 5 平台库列表为
根据您要在测试中使用的测试引擎,您还需要在类路径中添加以下库
对于 junit-vintage
引擎
对于 junit-jupiter
引擎
要将这些库添加到测试类路径中,您可以遵循以下两种方法之一
<classpath>
元素指定其余 JUnit 特定 jar 的位置(如上所述)。有关更多详细信息,请阅读 使用 classpath 元素 部分。测试由嵌套元素定义,例如 test
、testclasses
标签(请参阅 嵌套元素)。
属性 | 描述 | 必需 |
---|---|---|
includeTags | 一个逗号分隔的 JUnit 5 标签 列表,描述要包含的测试。 从 Ant 1.10.7 开始 |
否 |
excludeTags | 一个逗号分隔的 JUnit 5 标签 列表,描述要排除的测试。 从 Ant 1.10.7 开始 |
否 |
haltOnFailure | 如果任何测试中出现任何错误,则值为 true表示构建必须停止。JUnit 4+ 将错误分类为断言错误和在测试执行期间抛出的异常。因此,此任务也将这两种情况视为错误,并且不会区分它们。 |
否;默认值为 false |
failureProperty | 在发生错误时要设置的属性的名称(测试中的异常也被视为错误)。 | 否 |
printSummary | 如果将值设置为 true ,则此任务在测试执行完成后,会将执行摘要打印到 System.out 。从 Ant 1.10.10 开始,与以前版本不同,此任务本身会生成摘要,而不是使用 JUnit 5 平台生成的摘要。 |
否;默认为 false |
嵌套的 <classpath>
元素表示 类似 PATH 的结构,可用于配置任务以使用此类路径查找和运行测试。此类路径将用于
如果未为任务配置 classpath
元素,则 Ant 本身的类路径将用于查找测试类和 JUnit 库。
以下是如何设置类路径以在测试执行期间包含 Jupiter 测试引擎和 JUnit 平台库的示例。
<project> <property name="output.dir" value="${basedir}/build"/> <property name="src.test.dir" value="${basedir}/src/test"/> <property name="build.classes.dir" value="${output.dir}/classes"/> <target name="init"> <mkdir dir="${output.dir}"/> </target> <path id="junit.platform.libs.classpath"> <fileset dir="${basedir}/src/lib/junit-platform/"/> </path> <path id="junit.engine.jupiter.classpath"> <fileset dir="${basedir}/src/lib/jupiter/"/> </path> <target name="compile-test" depends="init"> <mkdir dir="${build.classes.dir}"/> <javac srcdir="${src.test.dir}" destdir="${build.classes.dir}"> <!-- our tests only need JUnit Jupiter engine libraries in our compile classpath for the tests --> <classpath refid="junit.engine.jupiter.classpath"/> </javac> </target> <target name="test" depends="compile-test"> <junitlauncher> <!-- include the JUnit platform related libraries required to run the tests --> <classpath refid="junit.platform.libs.classpath"/> <!-- include the JUnit Jupiter engine libraries --> <classpath refid="junit.engine.jupiter.classpath"/> <classpath> <!-- the test classes themselves --> <pathelement location="${build.classes.dir}"/> </classpath> <testclasses outputdir="${output.dir}"> <fileset dir="${build.classes.dir}"/> <listener type="legacy-brief" sendSysOut="true"/> <listener type="legacy-xml" sendSysErr="true" sendSysOut="true"/> </testclasses> </junitlauncher> </target> </project>
在上面的示例中,
src/lib/jupiter
目录预计包含 Jupiter 测试引擎相关的 jar(已 在此文档的前面部分列出)。src/lib/junit-platform
目录预计包含 JUnit 平台 jar(已 在此文档的前面部分列出)。在 test
目标中,我们使用 classpath
嵌套元素指向包含这些 jar 的 junit.engine.jupiter.classpath
和 junit.platform.libs.classpath
。在此 test
目标中,我们还使用另一个 classpath
元素指向包含测试类的位置。如果需要,所有这些类路径都可以组合成一个。
junitlauncher
任务可以使用 listener
来监听测试执行事件(例如测试执行开始、完成等)。监听器应该是一个实现 org.junit.platform.launcher.TestExecutionListener
的类。此 TestExecutionListener
接口是 JUnit 5 平台 API 公开的 API,与 Ant 无关。因此,您可以在此任务中使用任何现有的 TestExecutionListener
实现。
junitlauncher
提供了一种方法,可以通过该方法以可自定义的方式格式化和呈现测试执行结果。该任务允许通过使用 listener
元素来配置测试结果格式化程序。如前所述,listener
元素期望监听器实现 org.junit.platform.launcher.TestExecutionListener
接口。通常,结果格式化程序需要在测试执行期间向其提供更多配置详细信息,例如将格式化的结果写入的位置。任何此类监听器都可以选择实现 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter
接口。此接口特定于 Ant junitlauncher
任务,并且扩展了 org.junit.platform.launcher.TestExecutionListener
接口
junitlauncher
任务附带以下预定义的测试结果格式化程序类型
legacy-plain:此格式化程序为所有测试用例打印一个简短的统计行。
legacy-brief:此格式化程序打印失败或跳过的测试的信息。
legacy-xml:此格式化程序以 XML 格式打印测试的统计信息。
注意:每个名为 legacy
的格式化程序都尝试以类似于 junit
任务的格式化程序以前所做的方式格式化结果。此外,legacy-xml
格式化程序生成的 XML 符合 junit
任务的 XML 格式化程序以前遵循的相同模式。因此,此格式化程序生成的 XML 可以被 junitreport
任务原样使用。
listener
元素支持以下属性
属性 | 描述 | 必需 |
---|---|---|
type | 使用预定义的格式化程序(legacy-xml、 legacy-plain或 legacy-brief)。 |
这些属性中只有一个 |
classname | 实现 org.junit.platform.launcher.TestExecutionListener 或 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 接口的监听器类的名称 |
|
resultFile | 要将格式化的结果写入的文件名。此属性仅在监听器类实现 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 接口时才相关。如果未为此属性指定任何值,并且监听器实现了 此文件被认为是相对于监听器上配置的 |
否 |
extension | 要附加到输出文件名的扩展名。 从 Ant 1.10.13 开始 |
否;对于 legacy-xml格式化程序,默认为 xml,对于其他格式化程序,默认为 txt |
outputDir | 要创建监听器输出的目录。 从 Ant 1.10.6 开始 |
否 |
sendSysOut | 如果设置为 true,则监听器将被传递测试生成的 stdout 内容。此属性仅在监听器类实现 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 接口时才相关。 |
否;默认为 false |
sendSysErr | 如果设置为 true,则监听器将被传递测试生成的 stderr 内容。此属性仅在监听器类实现 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 接口时才相关。 |
否;默认为 false |
if | 仅在 设置了命名的属性时才使用此监听器。 | 否 |
unless | 仅在 未设置命名的属性时才使用此监听器。 | 否 |
useLegacyReportingName | 如果此监听器报告的测试标识符应该使用旧式(JUnit4 风格)名称,则设置为 true。否则设置为 false。 从 Ant 1.10.10 开始 |
否;默认为 true |
定义单个测试类。
属性 | 描述 | 必需 |
---|---|---|
name | 测试类的完全限定名。 | 是 |
methods | 要执行的测试用例方法的逗号分隔列表。如果指定了此列表,则将仅执行测试类中的这些测试方法。 | 否 |
haltOnFailure | 如果在测试运行期间发生错误(异常也被视为错误),则停止构建过程。覆盖在 junitlauncher 元素上设置的值。 |
否 |
failureProperty | 在发生错误时要设置的属性的名称(异常也被视为错误)。覆盖在 junitlauncher 元素上设置的值。 |
否 |
outputDir | 要写入报告的目录。 | 否;默认为项目的基目录。 |
if | 仅在 设置了命名的属性时才运行此测试。 | 否 |
unless | 仅在 未设置命名的属性时才运行此测试。 | 否 |
includeEngines | 一组逗号分隔的测试引擎 ID。如果指定了此列表,则将仅使用这些测试引擎来运行测试。 例如: includeEngines="junit-jupiter" 将仅使用 Jupiter 测试引擎来执行测试,并将忽略在类路径中找到的任何其他引擎。 |
否 |
excludeEngines | 一组逗号分隔的测试引擎 ID。如果指定了此列表,则在运行测试时将排除这些测试引擎。 例如: excludeEngines="junit-vintage" 将在执行测试时排除 vintage 测试引擎,并将使用在类路径中找到的任何其他引擎。 |
否 |
测试可以通过嵌套的 listener
元素定义自己的监听器。
可以使用 fork 嵌套元素在新的分叉 JVM 中运行测试。
根据模式匹配定义多个测试。
testclasses
收集来自任意数量嵌套的 资源 的包含的 资源集合。然后它选择每个名称以 .class
结尾的资源。这些类随后被传递给 JUnit 5 平台,由它决定并运行它们作为测试。
属性 | 描述 | 必需 |
---|---|---|
haltOnFailure | 如果在测试运行期间发生错误(异常也被视为错误),则停止构建过程。覆盖在 junitlauncher 元素上设置的值。 |
否 |
failureProperty | 在发生错误时要设置的属性的名称(异常也被视为错误)。覆盖在 junitlauncher 元素上设置的值。 |
否 |
outputDir | 要写入报告的目录。 | 否;默认为项目的基目录。 |
if | 仅在 设置了命名属性 时运行测试。 | 否 |
unless | 仅在 未设置命名属性 时运行测试。 | 否 |
includeEngines | 一组逗号分隔的测试引擎 ID。如果指定了此列表,则将仅使用这些测试引擎来运行测试。 例如: includeEngines="junit-jupiter" 将仅使用 Jupiter 测试引擎来执行测试,并将忽略在类路径中找到的任何其他引擎。 |
否 |
excludeEngines | 一组逗号分隔的测试引擎 ID。如果指定了此列表,则在运行测试时将排除这些测试引擎。 例如: excludeEngines="junit-vintage" 将在执行测试时排除 vintage 测试引擎,并将使用在类路径中找到的任何其他引擎。 |
否 |
testclasses
可以通过嵌套的 listener
元素定义自己的监听器。
嵌套的 fork 元素可用于在新分叉的 JVM 中运行测试。所有属于此 testclasses
元素的测试将在新分叉的 JVM 的单个实例中运行。
从 Ant 1.10.6 开始
使用junitlauncher
任务启动的测试默认情况下在启动任务的同一 JVM 中运行。可以使用 fork
元素更改此行为。fork
元素及其属性定义了将创建以启动测试的新 JVM 实例的特征。属性 | 描述 | 必需 |
---|---|---|
dir | 将用于分叉 JVM 的用户工作目录 | 否 |
timeout | 以毫秒为单位的值,指定在该分叉 JVM 中运行的测试允许运行的最大持续时间。如果测试运行时间超过此配置值,则 JVM 将被杀死 | 否 |
includeJUnitPlatformLibraries | 如果设置为 true ,则构成 JUnit 平台的 jar 文件将包含在分叉 JVM 的运行时类路径中。如果设置为 false ,则此任务的 配置的类路径(将提供给分叉 JVM 的运行时类路径)预计将包含 JUnit 平台库 jar 文件 |
否。值默认为 true 。 |
includeAntRuntimeLibraries | 如果设置为 true ,则构成 Ant 运行时的 jar 文件将包含在分叉 JVM 的运行时类路径中。如果设置为 false ,则此任务的 配置的类路径(将提供给分叉 JVM 的运行时类路径)预计将包含 Ant 运行时 jar 文件 |
否。值默认为 true 。 |
java | 用于启动分叉 java 进程的命令。此属性可以设置为指向与当前用于运行 Ant 构建的 Java 不同的 Java 安装自 Ant 1.10.14 起 |
否 |
forkMode | 控制为分叉测试启动多少个 JVM。允许的值为
自 Ant 1.10.14 起 |
否;默认情况下在单个分叉的 JVM 中启动所有测试类。 |
fork
元素允许以下嵌套元素可以通过 jvmarg
元素将其他 JVM 参数传递给分叉的 JVM。例如
<fork ...> <jvmarg value="-Dfoo=bar"/> ... </fork>
jvmarg
允许 命令行参数 中描述的所有属性
sysproperty
元素允许将 Java 系统属性传递给分叉的 JVM
<fork> <sysproperty key="greeting" value="hello world"/> ... </fork>
此元素的属性与 环境变量 的属性相同
可以使用 syspropertyset 指定一组用作系统属性的属性
可以通过嵌套的 env
元素指定要传递给分叉 JVM 的环境变量。有关 env
元素属性的描述,请参见 exec 任务中的描述。
可以使用 modulepath
元素指定 Java 模块的位置,该元素是 路径状结构。
<fork> <modulepath> <pathelement location="lib"/> <pathelement location="dist/test.jar"/> </modulepath> ... </fork>
可以使用 upgrademodulepath
元素指定替换运行时中可升级模块的 Java 模块的位置,该元素是 路径状结构。
启动 JUnit 5 平台以运行 org.myapp.SimpleTest 测试
<path id="test.classpath"> ... </path> <junitlauncher> <classpath refid="test.classpath"/> <test name="org.myapp.SimpleTest"/> </junitlauncher>
启动 JUnit 5 平台以运行 org.myapp.SimpleTest 和 org.myapp.AnotherTest 测试。如果 org.myapp.SimpleTest 中的任何测试失败,则构建过程将停止。
<junitlauncher> <classpath refid="test.classpath"/> <test name="org.myapp.SimpleTest" haltOnFailure="true"/> <test name="org.myapp.AnotherTest"/> </junitlauncher>
启动 JUnit 5 平台以仅运行 org.myapp.SimpleTest 测试类的 testFoo 和 testBar 方法。
<junitlauncher> <classpath refid="test.classpath"/> <test name="org.myapp.SimpleTest" methods="testFoo, testBar"/> </junitlauncher>
选择与 ${build.classes.dir} 下的 org/example/**/tests/**/ fileset
过滤器匹配的任何 .class 文件,并将这些类传递给 JUnit 5 平台以作为测试执行。
<junitlauncher> <classpath refid="test.classpath"/> <testclasses outputdir="${output.dir}"> <fileset dir="${build.classes.dir}"> <include name="org/example/**/tests/**/"/> </fileset> </testclasses> </junitlauncher>
选择与 ${build.classes.dir} 下的 org/example/**/tests/**/ fileset
过滤器匹配的任何 .class 文件,并将这些类传递给 JUnit 5 平台以作为测试执行。测试结果将由 legacy-xml
和 legacy-plain
格式化程序写入 ${output.dir},分别位于不同的文件中。此外,上面的 legacy-xml
和 legacy-plain
监听器都配置为接收测试生成的标准输出内容。legacy-xml
监听器配置为接收标准错误内容。
<junitlauncher> <classpath refid="test.classpath"/> <testclasses outputdir="${output.dir}"> <fileset dir="${build.classes.dir}"> <include name="org/example/**/tests/**/"/> </fileset> <listener type="legacy-xml" sendSysOut="true" sendSysErr="true"/> <listener type="legacy-plain" sendSysOut="true" /> </testclasses> </junitlauncher>