djUnitを使ってノリノリでユニットテスト

2008.03.04.火
技術

こんにちは。Sです。

PHPエンジニアで溢れかえっている社内メンバーにJavaの技術共有しても反応が寂しいので、今日は開発日誌で皆さんと技術共有したいと思います。

客先で作業している時の、とある話です。
「Sさん、djUnitっていうEclipseプラグイン知ってます?」と聞かれました。
でぃーじぇーゆにっと??DJ??
お恥ずかしい話、jUnitやDBUnitは知ってましたがdjUnit知らなかった私はつい
「何ですか?そのノリノリのプラグインは?」と答えてしまいました…。


その後、djUnitを教えて頂き、今ではユニットテストでは欠かせないツールとなっています。

ではdjUnitとはなにかというと、いわゆるユニットテストを行う為のTestRunnerなのですが、特にカバレッジレポートというカバレッジツールがとても素敵です。

カバレッジツールとはプログラムの網羅性をチェックするためのツールですが、
djUnitのカバレッジレポートを使うと視覚的にプログラムの網羅性をチェックする事ができます。

具体的にサンプルプログラムでdjUnitがどういうものか見ていきましょう。

package kp;

public class Kp1 {

public String getServiceName(String code) {

String name = "";
if (code.equals("0001")) {
name = "WebFile";
} else if (code.equals("0002")) {
name = "GrpMail";
} else if (code.equals("0003")) {
name = "PAMPS";
} else {
name = "Error";
}
return name;
}

}



引数に"0001"を渡すと戻り値として"WebFile"が返り、
引数に"0002"を渡すと戻り値として"GrpMail"が返り、
引数に"0003"を渡すと戻り値として"PAMPS"が返り、
引数に上記以外を渡すと戻り値として"Error"が返るという簡単なサンプルプログラムです。
(どうでもいいですが、戻り値の"WebFile"、"GrpMail"、"PAMPS"は全て弊社のサービス名です。)

それではテストクラスですが、jUnitと同様のテストクラスでdjUnitは実行できるので、
以下のようなプログラムを書きます。

package kp;
import junit.framework.TestCase;

public class Kp1Test extends TestCase {

public void test1() {
Kp1 kp1 = new Kp1();
assertEquals(kp1.getServiceName("0001"), "WebFile");
}

public void test2() {
Kp1 kp1 = new Kp1();
assertEquals(kp1.getServiceName("0002"), "GrpMail");
}
}



Test1では、引数に"0001"を渡し、戻り値が想定どおり"WebFile"か、
Test2では、引数に"0002"を渡し、戻り値が想定どおり"GrpMail"かをテストします。

ではテストを実行します。(実行方法はjUnitと同様でテストソース上で右クリック→実行→djUnitテストを選択)

テスト結果
ws000005.JPG

キャプチャのように、カバレッジレポートが表示されます。
jUnitのテストは緑色でうまくテストできているようですが、linesとbranchが100%にならず、インジケーターが全て緑色になっていません。

そうです、全てのパターンを網羅していないのです。
ソースのほうを見てみると黄色の波線が表示されていますが、これはテストが通っていない箇所を表しています。
これは超便利です!この部分が通るようにテストケースを追加すればよいのですから。

では、パターンを網羅するようテストケースを追加しましょう。

package kp;
import junit.framework.TestCase;

public class Kp1Test extends TestCase {

public void test1() {
Kp1 kp1 = new Kp1();
assertEquals(kp1.getServiceName("0001"), "WebFile");
}

public void test2() {
Kp1 kp1 = new Kp1();
assertEquals(kp1.getServiceName("0002"), "GrpMail");
}

public void test3() {
Kp1 kp1 = new Kp1();
assertEquals(kp1.getServiceName("0003"), "PAMPS");
}

public void test4() {
Kp1 kp1 = new Kp1();
assertEquals(kp1.getServiceName("0004"), "Error");
}

}



これで全てのテストパターンを網羅しているはずです。
ではテストを実行します。

ws000008.JPG

想定どおり、全てが緑色になり、全てのソースを網羅した事になります。
このようにdjUnitを使うことで、視覚的に網羅度を確認できるので、ノリノリでテストを行うことができます。