JUnitLauncher

説明

このタスクを使用すると、JUnit 5 フレームワークを使用してテストを起動し、実行できます。

JUnit 5 は、テストを記述して起動するための新しい API セットを導入しました。また、テストエンジンの概念も導入しました。テストエンジンは、どのクラスをテストケースと見なし、それらをどのように実行するかを決定します。JUnit 5 は、JUnit 4 の構成要素を使用して記述されたテストと、JUnit 5 の構成要素を使用して記述されたテストの両方を実行できます。JUnit 5 自体の詳細については、JUnit 5 プロジェクトのドキュメント (https://junit.dokyumento.jp/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

PATH のような構造を表すネストされた <classpath> 要素を使用して、テストの検索と実行にこのクラスパスを使用するようにタスクを設定できます。このクラスパスは、次の目的で使用されます。

タスクに 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 要素を使用して、テストクラスを含む場所を指します。必要に応じて、これらのクラスパスはすべて 1 つにまとめることができます。

リスナー

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 フォーマッタは、junit タスクの XML フォーマッタが従っていたのと同じスキーマに準拠するように XML を生成します。そのため、このフォーマッタによって生成された XML は、junitreport タスクでそのまま使用できます。

listener 要素は、次の属性をサポートしています。

属性 説明 必須
type 定義済みのフォーマッタ(legacy-xmllegacy-plain、または legacy-brief)を使用します。 これらのうち 1 つだけ
classname org.junit.platform.launcher.TestExecutionListener または org.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 指定されたプロパティが設定されている場合にのみ、このリスナーを使用します(プロパティの if と unlessを参照)。 いいえ
unless 指定されたプロパティが設定されていない場合にのみ、このリスナーを使用します(プロパティの if と unlessを参照)。 いいえ
useLegacyReportingName このリスナーによって報告されるテスト識別子がレガシー (JUnit4 スタイル) 名を使用する必要がある場合は true に設定します。それ以外の場合は false に設定します。

Ant 1.10.10 以降

いいえ。デフォルトは true です。

test

単一のテストクラスを定義します。

属性 説明 必須
name テストクラスの完全修飾名。 はい
methods 実行するテストケースメソッド名のカンマ区切りリスト。これが指定されている場合、テストクラスのこれらのテストメソッドのみが実行されます。 いいえ
haltOnFailure テスト実行中にエラーが発生した場合にビルドプロセスを停止します(例外もエラーと見なされます)。junitlauncher 要素に設定された値をオーバーライドします。 いいえ
failureProperty エラーが発生した場合に設定するプロパティの名前(例外はエラーと見なされます)。junitlauncher 要素に設定された値をオーバーライドします。 いいえ
outputDir レポートを書き込むディレクトリ。 いいえ。デフォルトはプロジェクトのベースディレクトリです。
if 指定されたプロパティが設定されている場合にのみ、このテストを実行します(プロパティの if と unlessを参照)。 いいえ
unless 指定されたプロパティが設定されていない場合にのみ、このテストを実行します(プロパティの 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 のインストール場所を指すように設定できます。

Ant 1.10.14以降

いいえ
forkMode フォークされたテスト用に起動される JVM の数を制御します。許可される値は次のとおりです。
  • perTestClass - このモードは、各テストクラスを個別にフォークされた JVM で起動します。これらの JVM はそれぞれ、各テストクラスの実行が完了するたびに、順番に 1 つずつフォークされます。 timeout 値が指定されている場合、そのタイムアウトは個々のテストではなく、すべてのテストが一緒に使用する時間に適用されます。

Ant 1.10.14以降

いいえ。デフォルトでは、すべてのテストクラスを 1 つのフォークされた JVM で起動します。
fork 要素では、次のネストされた要素を使用できます。
jvmarg

追加の JVM 引数は、jvmarg 要素を介してフォークされた 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

Java モジュールの場所は、パスのような構造である modulepath 要素を使用して指定できます。

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

ランタイムでアップグレード可能なモジュールを置き換える Java モジュールの場所は、パスのような構造である upgrademodulepath 要素を使用して指定できます。

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>