Java用の単体テストフレームワーク。
JUnitのようなテスティングフレームワークを活用することで、次のメリットがある。
また、単体テストコードがあれば、仕様変更時のデグレードを早い段階で発見することができる。
J2SE5。0のアノテーションを取り入れ、テスト記述方法のルールがシンプルになった。
import junit.framework.TestCase;
public class SampleTest extends TestCase {
}import static org.junit.Assert.*;
public class SampleTest {
}public void testFoo() {
}@Test
public void foo() {
}public void testException() {
String string = null;
try {
fail();
} catch (NullPointerException expected) {
assertTrue(true);
}
}@Test(expected=NullPointerException.class)
public void exception() {
String string = null;
string。toUpperCase();
}public void setUp() {
// 前処理
}@Before
public void before() {
// 前処理
}public void tearDown() {
// 後処理
}@After
public void after() {
// 後処理
}「@Test」の「timeout」要素に実行時間を記述する(ms)。
// 1500ms以下であること。
@Test(timeout=1500)
public void time() throws InterruptedException {
Thread。sleep(1000);
}
「@Ignore」を記述する。
@Ignore("実行しない理由を記述する")
@Test
public void foo() {
String string = "無視する";
assertEquals("無視する", string);
}
assertEquals(Object[] array1, Object[] array2);
assertEquals(String message, Object[] array1, Object[] array2);
「@BeforeClass」を記述する。
テストクラス実行前に一度だけ実行される。
@BeforeClass
public void beforClass() {
// 前処理
}
「@AfterClass」を記述する。
テストクラス実行後に一度だけ実行される。
@AfterClass
public void afterClass() {
// 後処理
}
テストクラスに「@RunWith(Parameterized.class)」を記述する。
パラメータ指定に「@Parameters」を記述する。
テスト対象値をパラメータで指定することで、テストコードの増大を防ぐことができる。
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class CalculatorTest {
private int x;
private int y;
private int expected;
// パラメータ指定した値がコンストラクタの引数に渡される.
public CalculatorTest(int x, int y, int expected) {
this.x = x;
this.y = y;
this.expected = expected;
}
// パラメータ指定
// staticとする
// コレクション型として返す.
@Parameters
public static List parameter() {
List<Integer[]> list = new ArrayList<Integer[]>();
// ここで指定した値がインスタンス生成時の引数と指定渡される.
list.add(new Integer[]{0, 0, 0});
list.add(new Integer[]{2, -1, 1});
list.add(new Integer[]{1, 1, 2});
return list;
}
@Test
public void add() {
System.out.println("addテストメソッド実行");
System.out.println("x=" + this.x);
System.out.println("y=" + this.y);
System.out.println("expected=" + this.expected);
// 足し算をする.
int actual = new Calculator().add(this.x, this.y);
assertEquals(this.expected, actual);
}
}addテストメソッド実行 x=0 y=0 expected=0 addテストメソッド実行 x=2 y=-1 expected=1 addテストメソッド実行 x=1 y=1 expected=2
現状のパラメータ指定の場合、テストメソッド毎パラメータを指定することはできない。
また、テストメソッドが複数ある場合の実行動作以下の通り。
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class CalculatorTest {
private int x;
private int y;
private int expected;
public CalculatorTest(int x, int y, int expected) {
this.x = x;
this.y = y;
this.expected = expected;
}
@Parameters
public static List parameter() {
List<Integer[]> list = new ArrayList<Integer[]>();
list.add(new Integer[]{0, 0, 0});
list.add(new Integer[]{2, -1, 1});
list.add(new Integer[]{1, 1, 2});
return list;
}
@Test
public void add() {
System.out.println("addテストメソッド実行");
System.out.println("x=" + this.x + " y=" + this.y + " expected=" + this.expected);
}
@Test
public void subtract() {
System.out.println("subtractテストメソッド実行");
System.out.println("x=" + this.x + " y=" + this.y + " expected=" + this.expected);
}
}
addテストメソッド実行 x=0 y=0 expected=0 subtractテストメソッド実行 x=0 y=0 expected=0 addテストメソッド実行 x=2 y=-1 expected=1 subtractテストメソッド実行 x=2 y=-1 expected=1 addテストメソッド実行 x=1 y=1 expected=2 subtractテストメソッド実行 x=1 y=1 expected=2
public class SampleTest2 {
static {
System.out.println("クラス初期化");
}
public SampleTest2() {
System.out.println("コンストラクタ");
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("@BeforeClass");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("@AfterClass");
}
@Before
public void setUp() throws Exception {
System.out.println("@Before");
}
@After
public void tearDown() throws Exception {
System.out.println("@After");
}
@Test
public void test() {
System.out.println("テストメソッド");
}
}クラス初期化 @BeforeClass コンストラクタ @Before テストメソッド @After @AfterClass
| アノテーション | 意味 |
|---|---|
| @Test | テスト対象のメソッドに記述する。 exception:例外テストの際、例外クラス名を記述する。 timeout:パフォーマンス検証テストの際、実行時間をミリ秒で記述する。 |
| @Before | テストメソッドの前処理のメソッドに記述する。 |
| @After | テストメソッドの後処理のメソッドに記述する。 |
| @BeforeClass | テストクラスの前処理のメソッドに記述する。 |
| @AfterClass | テストクラスの後処理のメソッドに記述する。 |
| @Ignore | テスト対象外にするメソッドに記述する(テストを実行しない場合に記述する)。 |
| @Parameters | テストで使用するパラメータを生成するメソッドに記述する。 |
| @RunWith | @Parametersで定義したパラメータを使用する等のテストランナを記述する。 |
Eclipse3.2〜