
JUnitの機能
- テストの実行フレームワーク
- テストの期待値と、実測値を検証してくれる。
- テストケースのフォーマット
テストの実行フレームワークのメリット
何度も自動実行することができる点
テストロジックをJUnitのプログラムとして記述しておき、一度作ったテストケースを何度も簡単に実行できるようにしておくことです。
これまでデグレが起きることを恐れて、機能の追加、改修を躊躇われているプロジェクトも多いかと思いますが、JUnitでテストケースを作成すれば、何度も簡単にテストをすることが可能になるので、そうしたテストの手間が大幅になくなり、安心して機能の改修を行うことができます。
テストの実行、検証、テスト結果のレポートを出力してくれる点
テストケースの実装や、テスト結果の確認だけであれば、JUnitを使わずに自分でJavaで実装することは可能です。
しかし、JUnit等のテストの実行フレームワークでは、検証や、テスト結果のレポートを出力してくれるので、いちいち自分でそれらを実装する手間が省けて、テストの設計と、実装に専念ができます。
JUnitのライセンス
CPL(Common Public License)ライセンスになります。
JUnit4の特徴
JUnitの最新メジャーバージョンは、「4」になります。
3から4への大きな変更点としては、Java5から実装されているアノテーションベースになったことです。
JUnit4のバージョン
バージョン | リリース日 | 特徴 |
---|---|---|
4.9 | 2012年10月21日 | |
4.10 | ||
4.11 | 2014年2月21日 | |
4.12 | 2014年12月4日 | |
4.13 | 2016年3月6日 |
テストクラス
テストを自動化するためのクラスです。この中にテストルールを記載する「テストメソッド」を記述します。
テストクラスの記述ルール
publicクラスとする。
テストメソッド
JUnitを利用するためのルールに従ったメソッドになります。
1メソッドが、1テストケースになり、1つのテストクラスに複数のテストメソッドを定義することも可能です。
テストメソッドの記述ルール
- org.junit.Testアノテーション(@Test)を付与する。
- publicメソッドとする。
- 引数は持たない。
- 戻り値はvoid
- throwsは自由に定義が可能です。
テストメソッドを記述する際の推奨ルール
基本的に、Javaコードのメソッド名を記載する場合は、英語名を記載していくと思いますが、テストメソッドのメソッド名は、日本語名になっているとわかりやすいので推奨されます。
throws句について
テストメソッドが例外を出した際に、テストを失敗として扱います。
そのために、throws句には通常は、Exceptionクラスを指定します。
Exceptionクラスにする理由
通常の開発では、Exceptionをthrowsにするのは、「何の例外であるかわらかない」ためコーディング規約等で、禁止されていることが多いでしょう。
ただ、JUnitでは、テストメソッド内に様々なメソッドを記述していくことになります。
メソッドによって様々な例外が生み出されそのたびに、throws句を修正するのは非常に大変なので、一律「Exceptionクラス」を使うのです。
テストメソッドでの検証(アサーション)
JUnitで、テスト結果を検証するには、主にorg.junit.AssertクラスのassertThatメソッドと、Matcher APIを利用します。
構文
1 |
assertThat(実測値, 期待値を含むMatcherオブジェクト); |
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.Test; public class Test { @Test public void test() { テスト対象クラス テスト対象クラスのオブジェクト = new テスト対象クラス(); int 期待値 = 期待値; int 実測値 = テスト対象クラスのオブジェクト.テスト対象のメソッド(引数); assertThat(実測値, is(期待値)); } } |
isメソッド
org.hamcrest.CoreMatchers.Matcherオブジェクトを生成するファクトリメソッドです。
staticインポートして使うので、クラス名を省略することができます。
使用できるアノテーションの種類
「テストメソッド」にて、使用できるアノテーションの種類としては、「@Test」以外にも多くのアノテーションがあります。
JUnitでは、下記のアノテーションを使用します。
- @Test
- @Ignore
- @Before
- @After
- @BeforeClass
- @AfterClass
@Test
テストメソッド(テストケース)を宣言するために使用します。
引数としては下記の二つを持ちます。
- expected属性
- timeout属性
expected属性
例外の送出を検証するテストで、送出が期待される例外を指定します。
例えば、テスト対象のメソッドが、「IOException」の発生を期待するのであれば下記のように記述します。
1 |
@Test(expected = IOException.class) |
timeout属性
ユニットテストのタイムアウト値を指定します。
テストの実行に対して、ここで指定した時間以上に時間がかかった場合は、テストが失敗とみなすようにします。
なお、timeout属性を指定しなかった場合は、永遠にテストメソッドは終了しません。
@Ignore
テストの実行から除外するためのアノテーションです。
一時的になんらかの理由で、テストケースを実行したくない場合に使用します。
@Before
テストの実行前に処理を行わすことができるアノテーションです。
基本的には、全てのテストメソッドで共通する初期化処理を定義します。
慣例として、メソッドの名前は「setUp」という名前にします。
共通化対象
処理の共通化対象は、同一のテストクラス内にとどめましょう。継承を使用すれば、複数のクラスに共通した共通処理を定義することも出来なくないですが、避けた方が無難です。
@After
テストケースの後続処理を記述します。メソッド名は、「tearDown」という名前にします。
このアノテーションで定義された終了処理は、テストの成否に限らず、必ず実行されます。
用途
「リソースの解放」等のメソッド終了時に行わせなければならない処理を記述します。
@BeforeClass
@Beforeと同じように、テスト実行前に一度だけ処理を行わせます。
ただ、Beforeと異なり、テストクラス単位で1回だけ実行されます。
テストメソッド間は独立しているべきという、ユニットテストの基本方針があるので、基本的にこのアノテーションを使うことはあまりありません。
@AfterClass
@Afterと同じように、テスト実行後に一度だけ処理を行わせます。
ただ、Afterと異なり、テストクラス単位で1回だけ実行されます。
「@BeforeClass」と同じように、基本的にこのアノテーションを使う機会は少ないです。
この記事へのコメントはありません。