0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ant発展 ②JUnit連携

0
Posted at

 こちらは「Ant発展 ①独自タスク」の続きです。

 目次記事はこちらです。

単体テストの実装

 JUnit を利用した単体テストを Ant で実装します。ただ、ちょっと具合が悪いことに Ant タスクには JUnit5 に対応したものがありません。あきらめて JUnit4 でいきます。

JUnit4のインストール手順

 まずは JUnit4 を扱うために jar ファイルを手に入れます。下記のサイトにアクセスして「Download and install」をクリックします。

image.png

 遷移先のページで「junit.jar」をクリックします。

image.png

 遷移先のページで「junit-4.13.2.jar」をクリックするとダウンロードすることができます。

image.png

 今度は hamcrest-core.jar をクリックして、下画像の hamcrest-core-1.3.jar をクリックします。ダウンロードが始まります。

image.png

 eclipse を開き、前までに作成した FallModelProject の lib フォルダに、ダウンロードした junit-4.13.2.jar と hamcrest-core-1.3.jar をコピペします。

image.png

 コピペした 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 で右クリック →【新規】→【ソース・フォルダー】をクリックして、新規ソース・フォルダーと書かれたウィンドウに下記を入力します。入力後、【完了】をクリックします。(ネストを解決するため...のチェックをつけないと【完了】ボタンがアクティブになりません)

image.png

 同じ手順で、今度はフォルダー名に「src/test」と入力して完了をクリックします。

 次に、src フォルダの中身をドラッグアンドドロップで src/main フォルダに移動させます。すべて移動したら src フォルダを右クリック →【削除】で削除します。最終的に下記の画像のようになれば OK です。

image.png

 ほんとはプロジェクト名を右クリック →【ビルド・パス】→【ビルド・パスの構成】から開くことができるウィンドウでソース・フォルダーの設定を行うのが普通です。このウィンドウの説明が面倒なのでやりませんでした。詳しくは eclipse のヘルプを参照してください。

image.png

 一応普通に【実行】ボタンがきくことを確認しときます。FallModelProject のデフォルトパッケージにある FallApp.java を右クリック →【実行】→【Javaアプリケーション】をクリックします。コンソールに次のように表示され、実行できることが確認できます。

image.png

 なお、IDEを使用せずに Ant プロジェクトを作成している場合、当然「実行」ボタンとかないので普通に新規フォルダーを作成するだけでよいです。(そのフォルダが実行すべきフォルダーかどうかは、IDE ではなく自作の build.xml に記述することですな)

build.xml を編集

 変更されたフォルダ構成に従って build.properties と build.xml を編集します。

build.properties
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」に変更します。また、自作タスクは邪魔なので削除かコメントしておきます。

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}" />
	</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テスト・ケース という項目が現れるのでそれを選択して【次へ】をクリックします。

image.png

 次に現れたウィンドウで下記のように入力します。

 パッケージ:model.data
 名前:MatterTester
 テスト元クラス:model.data.Matter(これは【参照】ボタンをクリックして「Matter」と入力したほうが楽かも)

(なんとなく JUnit4 の軽い説明のために「どのメソッド・スタブを作成しますか?」の欄にすべてチェック付けました。)

image.png

 入力したら、【次へ】をクリックします。次のウィンドウでテストケースを作成したいメソッドにチェックをつけます。今回は setMass()getName()getMass() のテストケースを書くことにします。
 チェックを付けたら【完了】をクリックします。

image.png

 自動でいくつかテストケースが記述された MatterTester クラスが作成されます。下記を記述してテストケースを完成させます。(コメント部JUnit4の軽い説明なので書かなくて OK)

MatterTester.java
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」というタブが現れます。

image.png

テストタスクの追加

 テストケースを記述した java ファイルが作成できたので、次に build.xml にテストタスクを追加します。
 今回、テストの報告結果は FallModelProject 直下の「reports」フォルダにします。FallModelProject で右クリック →【新規】→【フォルダー】で「reports」と入力します。

 build.properties にテストの報告結果を置く場所を指定するプロパティを追記します。

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 を編集します。変更箇所は <!-- 追記 --> というコメントがあるので参考にしてください。

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のウィンドウが開きます。

image.png

 テストタスクの中身についてはあまり深堀しません。(気が向いたら別の記事でやるかも)
 詳しくは下記のサイトを参照してください。

おまけ。テスト結果を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ブラウザー】とすると、ブラウザでテスト結果を見ることができます。

次の記事

作成中...

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?