JavaのユニットテストJUnit入門


JUnit」Javaのユニットテストのためのフレームワークです。ユニットテストを書くことで正しく動いていることを検証できます。またJenkinsなどのCIツールで定期実行することで、ユニットテストのとおりに動いていることを継続的に保証できます。

👽 サンプルコード

テスト対象のSample.javaは次のとおりです。

public class Sample {
public static int toDouble(int num) {
return num * 2;
}
}

上のサンプルに対するJUnitのテストは次のようになります。

import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
public class SampleTest {
@Test
public void testToDouble() {
int actual = Sample.toDouble(10);
int expect = 20;
assertThat(actual, is(expect));
}
}

もし期待する値を返さない場合はつぎのようにテストが失敗します。

java.lang.AssertionError:
Expected: is <21>
but: was <20>

😸 例外を発生させるテスト:expected

例外エラーを通知したい場合はexpectedオプションをつけて期待する例外を書く。

@Test(expected=IndexOutOfBoundsException.class)
public void outOfBounds() {
new ArrayList<Object>().get(1);
}

😼 事前処理:@Before@BeforeClass

@Beforeをつけたメソッドは、各テストメソッドを実行する前に都度メソッドを実行します。

@Before
public void setUp() {
// テストの度に実行する処理
}
@Test
public void testOne() { /* ... */ }
@Test
public void testTwo() { /* ... */ }

@BeforeClassをつけたメソッドはテストを実行する前に一度だけメソッドを実行します。

@BeforeClass
public void setUp() {
// 全体のテストに対して、一度だけ実行する処理
}
@Test
public void testDoSomething() { /* ... */ }
}

🐝 事後処理:@After@AfterClass

@Afterを付けたメソッドは、各テストを実行した後に都度メソッドを実行します。

@Test
public void testOne() { /* ... */ }
@Test
public void testTwo() { /* ... */ }
@After
public void tearDown() {
// テスト実行後に都度実行する処理
}

@AfterClassをつけたメソッドは、全テストが完了した後に一度だけメソッドを実行します。

@Test
public void testTwo() { /* ... */ }
@AfterClass
public void tearDown() {
// テスト実行後に都度実行する処理
}

🗽 テストを構造化させる

@RunWith(Sample.class)
public class SampleTest {
public static class XXXの場合 {
@Before
public void setup() { /* ... */ }
@Test
public void testOne() { /* ... */ }
}
}

🏀 JUnitにおけるテストのルール

  • テスト対象のクラス名が「Xxx」なら、テストクラス名は「XxxTest」となる
  • テスト対象のメソッド名が「Yyy」なら、テストメソッド名は「testYyy」となる
  • テストメソッドに対してアノテーション「@Test」をつける。「public void」にする
  • テストメソッドは「assertThat(実際の値, is(期待値));」とする
  • 「前提条件、実行、検証」がわかりやすいコードを記述する

🐮 一時的にテストを無視する:@ignore

@Ignoreを付与することで、一時的にテストを無視できます。

@Ignore @Test
public void doSomething() { /* ... */ }

🍄 参考リンク

📚 おすすめの書籍