こちらは「Ant発展 ①独自タスク」の続きです。
目次記事はこちらです。
単体テストの実装
JUnit を利用した単体テストを Ant で実装します。ただ、ちょっと具合が悪いことに Ant タスクには JUnit5 に対応したものがありません。あきらめて JUnit4 でいきます。
JUnit4のインストール手順
まずは JUnit4 を扱うために jar ファイルを手に入れます。下記のサイトにアクセスして「Download and install」をクリックします。
遷移先のページで「junit.jar」をクリックします。
遷移先のページで「junit-4.13.2.jar」をクリックするとダウンロードすることができます。
今度は hamcrest-core.jar をクリックして、下画像の hamcrest-core-1.3.jar をクリックします。ダウンロードが始まります。
eclipse を開き、前までに作成した FallModelProject の lib フォルダに、ダウンロードした junit-4.13.2.jar と hamcrest-core-1.3.jar をコピペします。
コピペした junit-4.13.2.jar と hamcrest-core-1.3.jar を選択して右クリック →【ビルドパス】→【ビルドパスに追加】をクリックします。最終的に FallModelProject の 参照ライブラリー に junit-4.13.2.jar と hamcrest-core-1.3.jar が現れれば OK です。
フォルダ構成の変更
現在のフォルダ構成のままでは、テスト用のソースコードの置き場がありません。これからテスト用のソースコードを格納するフォルダを作ります。
eclipse を使用する場合、eclipse に備わる「実行」ボタンも使えた方が便利です(今は Ant の学習中なので使わないけど)。eclipse では「実行」ボタンを押したときにビルドするフォルダを「ソース・フォルダー」と呼びます。
せっかくなんで、テスト用のフォルダーもソース・フォルダーとして扱いましょう。FallModelProject で右クリック →【新規】→【ソース・フォルダー】をクリックして、新規ソース・フォルダーと書かれたウィンドウに下記を入力します。入力後、【完了】をクリックします。(ネストを解決するため...のチェックをつけないと【完了】ボタンがアクティブになりません)
同じ手順で、今度はフォルダー名に「src/test」と入力して完了をクリックします。
次に、src フォルダの中身をドラッグアンドドロップで src/main フォルダに移動させます。すべて移動したら src フォルダを右クリック →【削除】で削除します。最終的に下記の画像のようになれば OK です。
一応普通に【実行】ボタンがきくことを確認しときます。FallModelProject のデフォルトパッケージにある FallApp.java を右クリック →【実行】→【Javaアプリケーション】をクリックします。コンソールに次のように表示され、実行できることが確認できます。
なお、IDEを使用せずに Ant プロジェクトを作成している場合、当然「実行」ボタンとかないので普通に新規フォルダーを作成するだけでよいです。(そのフォルダが実行すべきフォルダーかどうかは、IDE ではなく自作の build.xml に記述することですな)
build.xml を編集
変更されたフォルダ構成に従って build.properties と build.xml を編集します。
src.main.dir=src\\main
src.test.dir=src\\test
build.main.dir=target\\main
build.test.dir=target\\test
build.xml の方では、「src.dir」を「src.main.dir」に、「target.dir」を「target.main.dir」に変更します。また、自作タスクは邪魔なので削除かコメントしておきます。
<?xml version="1.0" encoding="UTF-8"?>
<project name="FallModelProject" default="execute" basedir=".">
<!-- プロパティの設定 -->
<property file="build.properties" />
<!-- クラスパスの設定 -->
<path id="build.lib">
<fileset dir="lib" includes="*.jar" />
<pathelement location="${build.main.dir}" />
</path>
<!-- 自作タスクはコメント、または削除
<taskdef name="original" classname="origintask.PracTask" classpath="${build.dir}" />
<taskdef name="files" classname="origintask.FilesTask" classpath="${build.dir}" />
<target name="practask">
<original message="HELLO ORIGINAL ANT TASK!" />
</target>
<target name="showfiles">
<files oss="Windows"/>
</target>
-->
<!-- クリーンタスク -->
<target name="clean">
<echo message="クリーンタスクを実行" />
<delete dir="${build.main.dir}" />
<mkdir dir="${build.main.dir}" />
</target>
<!-- コンパイルタスク -->
<target name="compile" depends="clean">
<echo message="コンパイルタスクを実行" />
<javac srcdir="${src.main.dir}" destdir="${build.main.dir}" includeantruntime="false">
<classpath>
<path refid="build.lib" />
</classpath>
</javac>
</target>
<!-- 実行タスク -->
<target name="execute" depends="compile">
<echo message="実行タスクを実行" />
<java classname="FallApp">
<classpath>
<path refid="build.lib" />
</classpath>
</java>
</target>
</project>
Ant ビルドを実行して正しく動作することを確認します。
テスト用のソースコードを作成
これからテスト用のソースコードを作成します。これは IDE の便利機能を使う方が楽なので使っちゃいましょう。
FallModelProject の src/test で右クリック →【新規】→【その他】を選択します。現れたウィンドウで名前に「junit」と入力すると JUnitテスト・ケース という項目が現れるのでそれを選択して【次へ】をクリックします。
次に現れたウィンドウで下記のように入力します。
パッケージ:model.data
名前:MatterTester
テスト元クラス:model.data.Matter(これは【参照】ボタンをクリックして「Matter」と入力したほうが楽かも)
(なんとなく JUnit4 の軽い説明のために「どのメソッド・スタブを作成しますか?」の欄にすべてチェック付けました。)
入力したら、【次へ】をクリックします。次のウィンドウでテストケースを作成したいメソッドにチェックをつけます。今回は setMass()、getName()、getMass() のテストケースを書くことにします。
チェックを付けたら【完了】をクリックします。
自動でいくつかテストケースが記述された MatterTester クラスが作成されます。下記を記述してテストケースを完成させます。(コメント部JUnit4の軽い説明なので書かなくて OK)
package model.data;
import static org.hamcrest.CoreMatchers.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
public class MatterTester {
@Rule
/*
* JUnit4 が提供するテストのルールを記述します。
* 下記では ErrorCollector というルールを追加しています。
* ErrorCollector は、
* テスト途中で失敗してもとりあえず最後まで続けて
* 終わってからまとめてテスト結果を報告する
* というルールです。
*/
public ErrorCollector errorCollector = new ErrorCollector();
@BeforeClass
/*
* テストを実行する時に一度だけ実行される。
* 外部からパラメータ取得するとか、初期化処理を書くところ。
*/
public static void setUpBeforeClass() throws Exception {
System.out.println("@BeforeClassがついたメソッド実行");
}
@AfterClass
/*
* テスト終了後に一度だけ実行される
* @BeforeClassの時に取得した外部リソースの解放とかやる。
*/
public static void tearDownAfterClass() throws Exception {
System.out.println("@AfterClassがついたメソッド実行");
}
@Before
/*
* 各テストに共通する前処理を書くところ。
* @Testが付いたテストが実行されるたびに初めに呼び出される
*/
public void setUp() throws Exception {
System.out.println("...前処理中...");
}
@After
/*
* 各テストに共通した後処理を書くところ。
* @Testがついたテストが実行されるたびに最後に呼び出される
*/
public void tearDown() throws Exception {
System.out.println("...後処理中...");
}
@Test
/*
* 実際のテストケースの記述
* test[テスト対象のメソッド]() というメソッド名で作るのが一般的
* ここはsetMass()メソッドのテスト
*/
public final void testSetMass() {
Matter m = new Matter("一円玉", 1.0);
m.setMass(100.0);
errorCollector.checkThat(m.mass, is(100.0));
}
@Test
/*
* getName()メソッドのテスト
*/
public final void testGetName() {
Matter m = new Matter("一円玉", 1.0);
errorCollector.checkThat(m.getName(), is("一円玉"));
}
@Test
/*
* getMass()メソッドのテスト
*/
public final void testGetMass() {
Matter m = new Matter("一円玉", 1.0);
errorCollector.checkThat(m.getMass(), is(1.0));
}
}
書けたら、一度 eclipse でテストを実行してみましょう。MatterTester.java で右クリック →【実行】→【JUnitテスト】をクリックします。
コンソールにテスト中の System.out.plintln の文字列が表示され、新たに「JUnit」というタブが現れます。
テストタスクの追加
テストケースを記述した java ファイルが作成できたので、次に build.xml にテストタスクを追加します。
今回、テストの報告結果は FallModelProject 直下の「reports」フォルダにします。FallModelProject で右クリック →【新規】→【フォルダー】で「reports」と入力します。
build.properties にテストの報告結果を置く場所を指定するプロパティを追記します。
src.main.dir=src\\main
src.test.dir=src\\test
build.main.dir=target\\main
build.test.dir=target\\test
junit.output.dir=reports
次に build.xml を編集します。変更箇所は <!-- 追記 --> というコメントがあるので参考にしてください。
<?xml version="1.0" encoding="UTF-8"?>
<project name="FallModelProject" default="execute" basedir=".">
<!-- プロパティの設定 -->
<property file="build.properties" />
<!-- クラスパスの設定 -->
<path id="build.lib">
<fileset dir="lib" includes="*.jar" />
<pathelement location="${build.main.dir}" />
<pathelement location="${build.test.dir}" /> <!-- 追記 -->
</path>
<!-- クリーンタスク -->
<target name="clean">
<echo message="クリーンタスクを実行" />
<delete dir="${build.main.dir}" />
<mkdir dir="${build.main.dir}" />
<delete dir="${build.test.dir}" /> <!-- 追記 -->
<mkdir dir="${build.test.dir}" /> <!-- 追記 -->
</target>
<!-- コンパイルタスク -->
<target name="compile" depends="clean">
<echo message="コンパイルタスクを実行" />
<javac srcdir="${src.main.dir}" destdir="${build.main.dir}" includeantruntime="false">
<classpath>
<path refid="build.lib" />
</classpath>
</javac>
<!-- 追記 テストコードが置かれたフォルダもコンパイル -->
<javac srcdir="${src.test.dir}" destdir="${build.test.dir}" includeantruntime="false">
<classpath>
<path refid="build.lib" />
</classpath>
</javac>
</target>
<!-- 追記 テストタスク -->
<target name="test" depends="compile">
<junit printsummary="yes" haltonfailure="yes">
<classpath>
<path refid="build.lib" />
</classpath>
<formatter type="xml"/>
<test name="model.data.MatterTester" todir="${junit.output.dir}"/>
</junit>
</target>
<!-- 実行タスク -->
<target name="execute" depends="compile">
<echo message="実行タスクを実行" />
<java classname="FallApp">
<classpath>
<path refid="build.lib" />
</classpath>
</java>
</target>
</project>
書けたら Ant ビルドを実行します。testタスクを選択して実行しましょう。
実行すると、reportsフォルダの中にテスト結果が格納されます。ダブルクリックすると eclipse の機能でJUnitのウィンドウが開きます。
テストタスクの中身についてはあまり深堀しません。(気が向いたら別の記事でやるかも)
詳しくは下記のサイトを参照してください。
おまけ。テスト結果をHTMLで出力
reports フォルダの下に html フォルダを新規作成します。次のタグをテストタスクに追加してください。
<!-- テストタスク -->
<target name="test" depends="compile">
<junit printsummary="yes" haltonfailure="yes">
<classpath>
<path refid="build.lib" />
</classpath>
<formatter type="xml"/>
<test name="model.data.MatterTester" todir="${junit.output.dir}"/>
</junit>
<junitreport todir="${junit.output.dir}">
<fileset dir="${junit.output.dir}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${junit.output.dir}\\html"/>
</junitreport>
</target>
test タスクを実行すると、html フォルダの下にテスト結果が html 形式で保存されます。index.html を右クリック →【次で開く】→【Webブラウザー】とすると、ブラウザでテスト結果を見ることができます。
次の記事
作成中...













