- 7.1. プロパティ(Property)
- 7.2. ファイルシステム(Mkdir, Copy, Move, Delete)
- 7.3. コンパイル(Javac)
- 7.4. パッケージ(Jar, War)
- 7.5. テスト(JUnit)
- 7.6. 実行
7.4. パッケージ(Jar, War)
jarファイルを作ります。warファイルを作るためのWarタスクもあります。
基本的な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| destfaile(共通) | 作成するjarファイル名 | はい |
| basedir(共通) | jarファイルの元となるディレクトリ | いいえ。入れ子のfileset等で指定することも出来ます |
| webxml(War) | サーブレット設定ファイル(web.xml)のパスを指定します | はい1 |
7.5. テスト(JUnit)
JUnitを使った単体テスト(指定されたもの、または複数まとめて)を実行します。Antバージョン1.8ではJUnit3以上をサポートします。
準備
junitタスクの実行にはjunit.jarとant-junit.jarが必要です。バージョン1.7以降ではant-junit.jarがAntのバイナリに同梱されるようになったので、junit.jar を含むパスが<junit>の中の<classpath>で指定されていれば動作します。それ以前のバージョンについてはマニュアルを参照ください。
<junit>
<classpath>
<fileset dir="lib" includes="junit.jar" />
</classpath>
<test name="example.MyTest" />
</junit>
パラメータ
<junit>に指定できる主な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| printsummary | テストケース毎に一行統計情報を出力します | いいえ |
| fork | antを実行しているのとは異なるVM上でテストを実行します | いいえ |
| haltonerror | テスト実行中にエラーが発生したらビルドを停止します | いいえ |
| haltonfailure | テストが失敗したらビルドを停止します。 | いいえ |
実際のテスト実行に関する指定は入れ子の要素で行います。
実行結果のフォーマット
テスト結果はファイルに書き込まれます。<formatter>で、出力形式を選択します。
<formatter>に指定できる主な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| type | テストの出力形式を選択します ・xml:XML形式 ・plain:テキスト形式、全てのテストについて表示 ・brief:テキスト形式、失敗したテストについてのみ表示 ・failure:バージョン1.8以降。失敗したケースを集めたテストクラスを作成 |
はい |
一つのテストを実行
テストを一つだけ指定して実行するには<test>を使います。
<test>に指定できる主な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| name | テストクラス名を指定します 例:"my.test.Testcase" |
はい |
| todir | テスト結果ファイルを出力するディレクトリを指定します | いいえ。省略時はカレントディレクトリ |
| outfile | テスト結果ファイルの拡張子を除いた名前を指定します | いいえ。省略時は “TEST-name” (name:属性で指定したテストクラス名) |
複数のテストを実行
<batchtest>を使うと複数のテストをまとめて実行することが出来ます。
<batchtest>に指定できる主な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| todir | テスト結果ファイルを出力するディレクトリを指定します | いいえ。省略時はカレントディレクトリ |
テスト対象を指定するには、テストクラスをコンパイルしたクラスファイルの場所、または、テストコードのソースディレクトリをリソースコレクション(fileset等)を使って指定します。
以下はテストコードのソースディレクトリから、任意のパッケージで、ファイル名が"Test.java"で終わるものを探して実行します。
<batchtest todir="${test.reports.dir}">
<fileset dir="${test.src.dir}">
<include name="**/*Test.java"/>
</fileset>
</batchtest>
7.6.実行
javaタスクは指定したjavaクラスを実行することが出来ます。主な属性は以下の通りです。また子要素でコマンドライン引数その他詳細を指定します。
| 属性 | 説明 | 必須 |
|---|---|---|
| classname | 実行するクラス名を指定します 例:"my.executable.Main" |
はい |
| classpathref | 実行時クラスパスの参照 | いいえ |
| fork | Antを実行しているのとは異なるVM上で実行します | いいえ。省略時はNo |
| maxmemory | fork指定時に新しいVMの最大メモリを指定します | いいえ |
| spawn | fork指定時にプログラムがantから切り離されて実行されます。下記inputstringやプログラムの出力先の指定は無効となります。 | いいえ |
| inputstring | 実行するプログラムに対する標準入力を与えます。 | いいえ。 省略時はコンソールからの入力を取ります。 |
コマンドライン引数
プログラムにコマンドライン引数を与えるには子要素に<arg>を指定します。
主な属性は以下の通りです。
| 属性 | 説明 | 必須 |
|---|---|---|
| value | 引数を1つ指定します。つまり、引数が複数ある場合は、 <arg value=“arg1”/> <arg value=“arg2”/> と複数回指定します。値にスペースを含めることも出来ます。 |
はい |
バックグラウンドで実行する
Unix系のシステムで、forkを有効にして起動したプログラムをバックグラウンドで実行させ続けることができます。ただし、普通に
$ ant &
とすると、Antはコンソールからの入力を待つために一時停止状態となります。
これを避けるには、spawn="true"またはinputstring=""を指定して下さい。
<java classname="my.executable.LongRunningJob" fork="yes" inputstring="">
<classpath>
<path refid="${runtime.classpath}"/>
</classpath>
</java>
実習課題
- 以下のプログラムとテストプログラムに対し、コンパイルから単体テスト実行までを行うビルドファイルを作成し、実行結果を確認して下さい。
- テスト結果のフォーマットを変えて違いを確認して下さい。
- テストが通るようにプログラムを変更し、ビルドファイルにプログラムを実行するタスクを追加して下さい。
public class Calc {
public enum Mode {Summation, Product, Nop};
private Mode mode;
public Calc(Mode mode) {
this.mode = mode;
}
public static Calc instanceOf(String mode) {
for (Mode m : Mode.values()) {
if (mode.equals(m.name())) {
return new Calc(m);
}
}
return new Calc(Mode.Nop);
}
public int apply(String numbers) {
int result = 0;
for (int n : parse(numbers)) {
if (mode == Mode.Summation) {
result += n;
}
}
return result;
}
private int[] parse(String csv) {
String[] array = csv.split(",");
int[] numbers = new int[array.length];
for (int i = 0; i < array.length; i++) {
numbers[i] = Integer.parseInt(array[i]);
}
return numbers;
}
public static void main(String[] args) {
Calc c = Calc.instanceOf(args[0]);
System.out.println(c.apply(args[1]));
}
}
import org.junit.Assert;
import org.junit.Test;
public class CalcTest {
@Test
public void testSum() {
Calc c = Calc.instanceOf("Summation");
Assert.assertEquals(7, c.apply("1,2,4"));
}
@Test
public void testProduct() {
Calc c = Calc.instanceOf("Product");
Assert.assertEquals(8, c.apply("1,2,4"));
}
}
1 Sevlet2.5以降はweb.xmlが必須ではないので、バージョン1.7以降では省略する書き方もあります。

