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
Junit4.4から新しいアサーションメソッド「assertThat」が追加された。
これまでのアサーションメソッドは、メソッド自体がアサーション条件であったが、「assertThat」では、引数にアサーション条件を指定する。
同値チェック
今まで
// assertEquals(期待値, 実行値); assertEquals(3, 1 + 2);
assertThatを使用
// assertThat(実行値, is(期待値)); assertThat(1 + 2, is(3));
assertThatアサーションメソッドを使用すると、正しいかの条件の指定(「assertThatメソッドの引数」)をより英語の文のような感じになる。
注意事項
「import static」で以下のクラスをインポートすること。
上記サンプルの「is()」は、「org.hamcrest.CoreMatchers」クラスのスタティックメソッド。
// JMockのマッチングクラス import static org.hamcrest.CoreMatchers.*; // JUnitのマッチングクラス import static org.junit.matchers.JUnitMatchers.*;
メソッド名 | 用途 |
---|---|
allOf | 指定した比較メソッドが全てtrueであるかチェック |
anyOf | 指定した比較メソッドが1つでもtrueであるかチェック |
is | 同値比較(equalToのショートカット) assertThat(2, is(2)); |
not | 指定した値ではないチェック assertThat(1, is(not(2))); |
equalTo | 同値チェック assertThat(2, equalTo(2)); |
instanceOf | 指定したクラスのインスタンスであるかチェック assertThat(new ArrayList(), instanceOf(ArrayList.class)); |
sameInstance | 同じインスタンスであるかチェック String same = "same"; assertThat(same, sameInstance(same)); |
anything | |
any | |
nullValue | 「null」チェック assertThat(null, nullValue()); |
notNullValue | not「null」チェック assertThat("", notNullValue()); |
describedAs |
メソッド名 | 用途 |
---|---|
hasItem | 指定した値を保持しているかチェック assertThat(Arrays.asList(new String[]{"3"}), hasItem("3")); |
hasItems | 指定した値を全て保持しているかチェック assertThat(Arrays.asList(new String[]{"3", "4", "5"}), hasItems("3", "4")); |
containsString | 指定した文字列を含んでいるかチェック assertThat("test", containsString("t")); |
each | コレクションんが保持する値が全て指定した値であるかチェック assertThat(Arrays.asList(new String[]{"3", "3"}), each(is("3"))); |
both | 指定した比較メソッドが全てtrueであるかチェック(and()メソッドを使用) assertThat("test", both(containsString("t")).and(containsString("s"))); |
either | 指定した比較メソッドが1つでもtrueであるかチェック(or()メソッドを使用) assertThat("test", either(containsString("t")).or(containsString("a"))); |
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〜