2010年1月17日日曜日

JUnitで単体テスト

プログラムを書いた時にテストを行うことは非常に重要です。
プログラムのテストと言っても、
単体テスト => 結合テスト => システムテスト
と、段階的に行うのが一般的なようです。

各テストをどのような観点で行うかはさておき、Javaで書いたプログラムの単体テストを支援するフレームワークとしてJUnitがあります。

NetBeansには標準でJUnitが入っていますので、ちょっと使ってみたいと思います。
(利用環境はNetBeans6.8ですが、他のVersionでも多分一緒)

1.テスト対象のクラスの作成
適当な名前でプロジェクトを作成して、以下のコードを作成します。(パッケージ等は適当に。)

今回のテスト対象クラスFactorialClass。

package jp.taka.factorial;

/**
* 階乗計算をするクラスです。。。
* @author taka
*/
public class FactorialClass {
/**
* ループを使って階乗を計算します。
* @param x
* @return x!
*/
public static int factorial(int x){
int fact = 1;
for(int i=x; i>=1;i--){
fact *= i;
}
return fact;
}

/**
* 再帰を使って階乗を計算します。
* @param x
* @return x!
*/
public static int factorial2(int x){
if(x > 1)
return x*factorial2(x-1);
else
return 1;
}
}


一応Mainも。。

package jp.taka.factorial;

public class Main {
public static void main(String[] args) {
int f1 = FactorialClass.factorial(4);
int f2 = FactorialClass.factorial2(4);

System.out.println(f1);
System.out.println(f2);
}
}


ここまでで、NetBeansのプロジェクトエクスプロラー(?)はこんな感じになると思います。


2.テストコード作成
ここからがJUnitの出番です。(今回はJUnit4を使います)

プロジェクトを右クリックして新規->その他を選択すると、ウィンドウが一つ開くので、下図のように選択し、次へをクリックします。


次の画面はこんな感じで、完了をクリック。


ここまでくると、NetBeansがテストクラスのひな形を作成してくれます。
それを下のようにいじります。
ここでのポイントは、
・assertEquals():第一引数と第二引数が一致しているか判定
・@Testアノテーション:メソッドがテストメソッドであることを明示する


package jp.taka.factorial;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
*
* @author taka
*/
public class FactorialClassTest {

public FactorialClassTest() {
}

@BeforeClass
public static void setUpClass() throws Exception {
}

@AfterClass
public static void tearDownClass() throws Exception {
}

/**
* FactorialClass#factorial(int x)のテスト
*/
@Test
public void testFactorial() {
System.out.println("chk factorial");
int x = 4;
int expResult = 4*3*2*1;
int result = FactorialClass.factorial(x);
assertEquals(expResult,result );
}

/**
* FactorialClass#factorial2(int x)のテスト
*/
@Test
public void testFactorial2() {
System.out.println("chk factorial 2");
int x = 4;
int expResult = 4*3*2*1;
int result = FactorialClass.factorial2(x);
assertEquals(expResult,result );
}
}


3.テストをしてみよう
プロジェクト名を右クリックして、テストをクリックします(下図)


@Testアノテーションがついたテストメソッドが実行されます。
以下のような結果が出れば成功です。


ちなみに、テスト結果NGのモノがあった場合は、下図。


4.まとめ
今回は、NetBeansでJUnitを使って簡単なテストを行いました。
今回使ったのはassertEqualsだけですが、他にも色々ありますので、興味のある方は是非。

また、JUnit以外にも、CUnit(C言語用),CppUnit(C++言語用)などなどxUnitシリーズは沢山ありますので、研究でも役立つ・・・かも?

1 件のコメント:

師子乃 さんのコメント...

初めまして。

テスティングフレームワーク、今ではほとんどの開発環境で使えるのがうれしいですね。