JUnitLauncher

描述

此任务允许使用 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 引擎

要将这些库添加到测试类路径中,您可以遵循以下两种方法之一

测试由嵌套元素定义,例如 testtestclasses 标签(请参阅 嵌套元素)。

参数

属性 描述 必需
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

嵌套的 <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>
    

在上面的示例中,

test 目标中,我们使用 classpath 嵌套元素指向包含这些 jar 的 junit.engine.jupiter.classpathjunit.platform.libs.classpath。在此 test 目标中,我们还使用另一个 classpath 元素指向包含测试类的位置。如果需要,所有这些类路径都可以组合成一个。

listener

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 的格式化程序都尝试以类似于 junit 任务的格式化程序以前所做的方式格式化结果。此外,legacy-xml 格式化程序生成的 XML 符合 junit 任务的 XML 格式化程序以前遵循的相同模式。因此,此格式化程序生成的 XML 可以被 junitreport 任务原样使用。

listener 元素支持以下属性

属性 描述 必需
type 使用预定义的格式化程序(legacy-xmllegacy-plainlegacy-brief)。 这些属性中只有一个
classname 实现 org.junit.platform.launcher.TestExecutionListenerorg.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 接口的监听器类的名称
resultFile 要将格式化的结果写入的文件名。此属性仅在监听器类实现 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 接口时才相关。

如果未为此属性指定任何值,并且监听器实现了 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter,则文件名将默认为 TEST-testname.extension(例如:对于 legacy-xml 类型格式化程序,为 TEST-org.myapp.SomeTest.xml)。

此文件被认为是相对于监听器上配置的 outputDir 的。如果未在监听器上设置 outputDir,则该文件被认为是相对于运行此监听器的测试的上下文中的 outputDir 的。

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

test

定义单个测试类。

属性 描述 必需
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

根据模式匹配定义多个测试。

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 的单个实例中运行。

fork

从 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。允许的值为
  • perTestClass - 此模式在单独分叉的 JVM 中启动每个测试类。这些 JVM 中的每一个将按顺序一个接一个地分叉,当每个测试类执行完成后。如果指定了任何 timeout 值,则该超时适用于所有测试一起使用的时间,而不是单个测试。

自 Ant 1.10.14 起

否;默认情况下在单个分叉的 JVM 中启动所有测试类。
fork 元素允许以下嵌套元素
jvmarg

可以通过 jvmarg 元素将其他 JVM 参数传递给分叉的 JVM。例如

    <fork ...>
      <jvmarg value="-Dfoo=bar"/>
      ...
    </fork>
    

jvmarg 允许 命令行参数 中描述的所有属性

sysproperty

sysproperty 元素允许将 Java 系统属性传递给分叉的 JVM

    <fork>
        <sysproperty key="greeting" value="hello world"/>
    ...
    </fork>
    

此元素的属性与 环境变量 的属性相同

syspropertyset

可以使用 syspropertyset 指定一组用作系统属性的属性

env

可以通过嵌套的 env 元素指定要传递给分叉 JVM 的环境变量。有关 env 元素属性的描述,请参见 exec 任务中的描述。

modulepath

可以使用 modulepath 元素指定 Java 模块的位置,该元素是 路径状结构

例如
<fork>
  <modulepath>
    <pathelement location="lib"/>
    <pathelement location="dist/test.jar"/>
  </modulepath>
  ...
</fork>
upgrademodulepath

可以使用 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.SimpleTestorg.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 测试类的 testFootestBar 方法。

<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-xmllegacy-plain 格式化程序写入 ${output.dir},分别位于不同的文件中。此外,上面的 legacy-xmllegacy-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>