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」で始まる名前のターゲットをスキャンします。そのような各ターゲットに対して、次の処理を行います。
- setUpという名前のターゲットがあれば実行します。
- ターゲット自体を実行します。このターゲットが他のターゲットに依存している場合、通常のAntルールが適用され、依存するターゲットが最初に実行されます。
- 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