此任务允许使用 JUnit 5 框架启动和运行测试。
JUnit 5 引入了编写和启动测试的新 API 集。它还引入了测试引擎的概念。测试引擎决定哪些类被视为测试用例以及如何执行它们。JUnit 5 支持运行使用 JUnit 4 结构编写的测试,以及使用 JUnit 5 结构编写的测试。有关 JUnit 5 本身的更多详细信息,请参阅 JUnit 5 项目的文档:https://junit.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>