JUnitとは
- Javaプログラムにおいてユニットテストができるツール(フレームワーク)を行う
- テスト自動化ができる
- 手作業が減るため、テスト工数削減やヒューマンエラー防止に効果あり。
前提条件
- Eclipseがインストールされていること
- 以下のような構成のプロジェクト、パッケージ、プログラムファイルを作成していること
ProjectA ---- src
|
------ xx.yy.zzz(パッケージ)
|
------- Door.java (テスト対象クラス)
設定
パッケージxx.yy.zzz配下に、Door.java (テスト対象クラス)をテストするためのクラス「DoorTest.java」を作成します。
- Eclipseでプロジェクトを右クリック [新規] - [その他]をクリック
- 「Java」 - 「JUnit」 - 「Junitテストケース」を選択して 次へ をクリック
- 下図を参考に、必要な値を設定する
- 「DoorTest.java」の雛形ができました。
DoorTest.java
package xx.yy.zzz; // テスト対象クラスと同じパッケージにする
import static org.junit.Assert.*;
import org.junit.Test;
public class DoorTest {
@Test
public void test() {
fail("まだ実装されていません");
}
}
- 試しに実行してみましょう。 DoorTest.javaを右クリックして、 [実行] - [実行の構成]
テストプログラムを書く
テスト対象クラス
Door.java
package xx.yy.zzz; // テストクラスと同じパッケージにする
public class Door {
private boolean isOpen = false;
public void open(String str) {
if (str.equals("開けゴマ!")) {
isOpen = true;
} else {
isOpen = false;
System.out.println("違います。");
}
}
public void close() {
isOpen = false;
}
// getter
public boolean isOpen() {
return isOpen;
}
}
テスト内容
- test1. openメソッドで"開けゴマ!"以外を指定すると、ドアが開らない(isOpenメソッドの戻り値がfalse)こと。また、「違います。」と標準出力されていること。
- test2. openメソッドで"開けゴマ!"を指定すると、ドアが開く(isOpenメソッドの戻り値がtrue)こと。
- test3. closeメソッドでドアが閉じる(isOpenメソッドの戻り値がfalse)こと。
テストクラス
Door.java
package xx.yy.zzz; // テスト対象クラスと同じパッケージにする
import static org.junit.Assert.*;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DoorTest {
Door door;
private ByteArrayOutputStream baos;
// 前処理
@Before
public void setUp() {
door = new Door();
baos = new ByteArrayOutputStream();
System.setOut(
new PrintStream(
new BufferedOutputStream(baos)
)
);
}
// 「@Test」は、JUnitがテストメソッドと認識するためのアノテーション
// public voidで作成すること
@Test
public void test1() {
door.open("ドア、開いてください");
// 標準出力
System.out.flush();
String expected = "違います。\r\n";
String actual = baos.toString();
// 期待値との確認
assertEquals(false, door.isOpen());
assertEquals(expected, actual);
}
@Test
public void test2() {
door.open("開けゴマ!");
assertEquals(true, door.isOpen());
}
@Test
public void test3() {
door.close();
assertEquals(false, door.isOpen());
}
// 後処理
@After
public void fin() {
// DO Nothing
}
}
[補足]
- System.setOutメソッド:「標準」出力ストリームを割り当てし直します。引数はPrintStreamクラスです。
- PrintStreamクラス:新しい出力ストリームを作成するために使います。
- BufferedOutputStreamクラス:バッファのデータを出力ストリーム化します。
- ByteArrayOutputStreamクラス:データがバイト配列に書き込まれる出力ストリームを実装します。