Apache Ant site Apache Ant logo

Apache Ant サイト
ホーム
プロジェクト
 

Apache AntUnit

Apache AntUnit™

Apache AntUnitは、Apache Antタスクとタイプのテストフレームワークを提供するAntlibです。

Apache AntUnit 1.4.1

2021年7月7日 - Apache AntUnit 1.4.1 リリース

Apache AntUnit 1.4.1は、バイナリまたはソースリリースとしてダウンロードできます。

このリリースでは、antlib.xml記述子が修正され、AntUnitはAntUnitが推奨するURIをハードコードするのではなく、ユーザー定義のURIで使用できるようになりました。

経緯

当初、Apache Antタスクのすべてのテストは、個々のJUnitテストケースとして記述されていました。すぐに、ほとんどのテストで、ビルドファイルの読み取り、プロジェクトインスタンスの初期化、ターゲットの実行など、共通のタスクを実行する必要があることが明らかになりました。BuildFileTestは、ほとんどのタスクテストケースの基底クラスとして考案されました。

BuildFileTestは正常に機能し、実際にはAnt-Contribプロジェクトなどでも採用されています。

時間の経過とともに新しいパターンが進化し、ますます多くのテストがターゲットを実行するだけで、効果を確認しませんでした。代わりに、そのターゲットには、<fail>タスクとしてアサーションが含まれていました。これは、ANTLRタスクのビルドファイル(Ant 1.7の機能を使用)から取得した例です。

  <target name="test3" depends="setup">
    <antlr target="antlr.g" outputdirectory="${tmp.dir}"/>
    <fail>
      <condition>
        <!-- to prove each of these files exists;
             ANTLR >= 2.7.6 leaves behind new (.smap) files as well. -->
        <resourcecount when="ne" count="5">
          <fileset dir="${tmp.dir}">
            <include name="CalcParserTokenTypes.txt" />
            <include name="CalcParserTokenTypes.java" />
            <include name="CalcLexer.java" />
            <include name="CalcParser.java" />
            <include name="CalcTreeWalker.java" />
          </fileset>
        </resourcecount>
      </condition>
    </fail>
  </target>

対応するJUnitテストケースは、次のように簡略化されました。

...
public class ANTLRTest extends BuildFileTest {

    private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/optional/antlr/";

    public ANTLRTest(String name) {
        super(name);
    }

    public void setUp() {
        configureProject(TASKDEFS_DIR + "antlr.xml");
    }

    public void tearDown() {
        executeTarget("cleanup");
    }

    public void test3() {
        executeTarget("test3");
    }
...
}

このアプローチにはいくつかの利点があり、その1つは、バグレポートからテストケースに例示的なビルドファイルを簡単に変換できることです。Antの特定のバグのテストケースをユーザーに要求する場合、ユーザーはJUnitを理解したり、テストをAntの既存のテストに適合させる必要がなくなります。

AntUnitはこのテストアプローチをさらに推し進め、JUnitを完全に削除し、共通の種類のチェックを再利用するための、事前に定義された<assert>タスクのセットを提供します。

AntUnitは、他の問題に対する解決策としても役立ちます。アサーションは、ビルドプロセスを開始する前でも、設定を検証するための簡単な方法です。AntUnitは、Antタスクの範囲外での機能テストや統合テストにも使用できます(アプリケーションの実行後のデータベースの内容のアサーション、HTTPレスポンスの内容のアサーションなど)。これは、さらに調査が必要な分野です。

概念

antunit タスク

<antunit>タスクは、JUnitテストに対して<junit>タスクが行うように、テストを駆動します。

ビルドファイルで呼び出されると、タスクはそのビルドファイルに対して新しいAntプロジェクトを開始し、「test」で始まる名前のターゲットをスキャンします。そのような各ターゲットに対して、次の処理を行います。

  1. setUpという名前のターゲットがあれば実行します。
  2. ターゲット自体を実行します。このターゲットが他のターゲットに依存している場合、通常のAntルールが適用され、依存するターゲットが最初に実行されます。
  3. tearDownという名前のターゲットがあれば実行します。

アサーション

基本タスクは<assertTrue>です。これはネストされた条件を1つ受け入れ、その条件がfalseと評価された場合、AssertionFailedExceptionという名前のBuildExceptionのサブクラスをスローします。

このタスクは<macrodef><fail>を使用して実装することもできますが、実際にはBuildExceptionのサブクラスをスローできるため、「実体」タスクです。<antunit>タスクはこの例外をキャッチし、ターゲットが失敗したとマークします。その他のタイプの例外(他のBuildExceptionを含む)はテストエラーです。

<assertTrue>と共に、一般的な条件に対する事前に定義された多くのアサーションがあり、そのほとんどはマクロだけです。

その他のタスク

<logcapturer>は、Antのロギングシステムを通過するすべてのメッセージをキャプチャし、プロジェクト内の参照を介してそれらを公開します。特定のログメッセージをアサートする場合は、このタスクを(テスト対象のターゲットの前に)開始し、<assertLogContains>アサーションを使用する必要があります。

<expectFailure>は、ネストされたタスクによってスローされたBuildExceptionをキャッチするタスクコンテナです。例外がスローされなかった場合、テストの失敗(AssertionFailedExceptionのスロー)を引き起こします。

AntUnitListener

このライブラリの一部は、テスト結果を記録するために使用できるAntUnitListenerインターフェースです。<antunit>タスクは任意の数のリスナーを受け入れ、テスト結果をそれらに中継します。

"plain"と"xml"のJUnitリスナーをモデルにした、現在2つの実装(<plainlistener>xmllistener)がライブラリにバンドルされています。

これは、<touch>が存在しないファイルを作成するかどうかをテストする方法です。

<project xmlns:au="antlib:org.apache.ant.antunit">
  <!-- is called prior to the test -->
  <target name="setUp">
    <property name="foo" value="foo"/>
  </target>

  <!-- is called after the test, even if that caused an error -->
  <target name="tearDown">
    <delete file="${foo}" quiet="true"/>
  </target>

  <!-- the actual test case -->
  <target name="testTouchCreatesFile">
    <au:assertFileDoesntExist file="${foo}"/>
    <touch file="${foo}"/>
    <au:assertFileExists file="${foo}"/>
  </target>
</project>

独自のビルドファイルから

    <au:antunit>
      <fileset dir="." includes="touch.xml"/>
      <au:plainlistener/>
    </au:antunit>

のようなタスクを実行すると、次のような結果が表示されます。

[au:antunit] Build File: /tmp/touch.xml
[au:antunit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.249 sec
[au:antunit] Target: testTouchCreatesFile took 0.183 sec

BUILD SUCCESSFUL
Total time: 1 second