メソッドのテスト
通常,プログラムの汎用性向上や開発効率向上を目指すと,最終的に多数のメソッドを作成することになります.記憶力が続く間は良いのですが,その内一つ一つのメソッドの動作をきちんと検証する必要が出てきます.そこで役に立つ仕組みの一つにJUnitと呼ばれる,自動的にメソッドの動作を検証する仕組みがあります.
インストール
以下のサイトから3番の「JAR including Hamcrest」と書いてあるjunit-4.11.jarをダウンロードしてください.
(執筆時はver4.10が最新だったので,junit-4.10.jar)
追記:JUnit4.11がリリースされていたので,URLを変更しました.なお,以下のURL以外で配布されているjunit-4.11.jarには,hamcrest関連のクラスが同梱されておらず,コンパイルや実行時にエラーが出る場合があります.
junit-4.11.jarを,環境変数CLASSPATHに含まれるディレクトリに移してください.CLASSPATHが設定されていない場合は設定してください.
例:/hoge にjunit-4.11.jarが置かれている場合
$ export CLASSPATH=/hoge:/hoge/junit-4.11.jar;
テストコードをコンパイルしましょう.CLASSPATHが設定されていれば通常の手順でコンパイルできます.
例:TestClass.javaをコンパイルする
$ javac TestClass.java
最後に,テストを実行します.
$ java org.junit.runner.JUnitCore TestClass
メソッドの動作検証の例
ここでは,動作を検証するメソッドの例として,パラメータとして整数(int型)を受け取り,その値が偶数かどうかを判別するメソッドis_evenについて考える.
is_evenメソッドの仕様は下記のとおりとし,Method8クラスに属するものとする.
/**
* is_evenメソッド
* パラメータが偶数ならtrueを返し,奇数ならfalseを返す.
* @param number 数値
* @return 数値が偶数ならtrue
*/
public static boolean is_even( int number )
テスト用のクラス(UnitTest8a.java)は以下のように書きます.
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.*;
public class UnitTest8a {
/** 4ならばtrue */
@Test
public void test1() {
assertThat( Method8.is_even( 4 ), is( true ) );
}
/** 5ならばfalse */
@Test
public void test2() {
assertThat( Method8.is_even( 5 ), is( false ) );
}
}
基本的に,@Testに続いてテスト用のメソッドを記述します.すなわちテスト項目です.そのメソッド内でassertThatを呼び出します.第1パラメータが検証するコードで,第2パラメータが正しい動作結果です.動作結果はisメソッド内に書きます.
それでは実際にテストを実行してみましょう.
$ java org.junit.runner.JUnitCore UnitTest8a
JUnit version 4.11
..
Time: 0.009
OK (2 tests)
JUnit versionの次の行に.(ピリオド)が2つ続いています.ピリオド1つがテスト項目1つ分を表します.最後にOK (2 tests)と表示されているので,こちらからも2項目のテストを実施して,無事に動作検証が済んだことを示しています.
以上のように書式自体は単純かも知れませんが,その効果は絶大です.もしプログラムを変更しようとしているのなら,変更前にテスト項目を書いて動作を検証し,変更後に再度動作を検証すれば,変更したコードの正しさが保証されます.
実行のためのコマンドを簡略化する
「効果が絶大なのは分かったが,実行のためのクラス名が覚えられないよ」との意見ももっともです.そこで,もっと簡単に実行するためにテストのためのコードにmainメソッドを追加しましょう.追加するのはたったの3行です.
public static void main( String[] args ) {
org.junit.runner.JUnitCore.main( UnitTest8a.class.getName() );
}
言い忘れましたが,カッコ内のクラス名は,テストのためのクラス名に合わせてください.以上の3行を追加することにより,以下のように実行できます.
$ java UnitTest8a