JUnitをこれから使う方へ
自分自身、初めて仕事でJUnitを使うことになった時に苦しんだ経験があるので今回の投稿をしようと考えました。
1. JUnitとは
まず初めに単体テストについて説明します。
単体テストとは、作成した一つ一つの機能に対して正常に動作するかを確かめるために作成するテストを指します。
別名「ユニットテスト」「プログラムテスト」とも言います。
他にも結合テスト、システムテスト、運用テスト等があります。
単体テストの中でもJUnitはJavaで単体テストを実施するためのテスティングフレームワークです。
JUnitのメリットとしては以下が挙げられます。
▪単体テストを行うためのテストコードを簡単に生成できる
▪作成済みテストコードを用いて何度でも簡単にリグレッションテスト*1ができる
▪誰もが同じテストを実施できるようになる
▪独自にテストコードを作成する手間が省ける
*1.回帰テスト、退行テストとも呼ばれ、プログラムの一部分を変更したことで、ほかの箇所に不具合が出ていないかを確認するためのテストです
以上に挙げた通り、JUnitはjavaの大規模開発においてはとても重宝されます。
しかしデメリットもあり、
▪テスト対象の独立性が前提であり、他の部品に依存している場合は工夫が必要
▪そもそもテストコードを書くのに工数がかかってしまう
などが挙げられます。
2. JUnitの実装の仕方
JUnitの実装の流れを説明します。
今回はクラス作成から全て説明するととても長くなってしまうのでテスト対象クラス作成の説明は省きます。
以下のようなテスト対象のクラスを適当に作りました。
引数の文字列を結合して返す簡単なメソッドです。
このメソッドをテストするにはjavaファイル上で右クリックして「新規」→「その他」→「JUnitテスト・ケース」を選択します。
テストしたいメソッドを選択することで自動的に対応したメソッドを作ってくれます。
あとは検証用のテストケースを実装します。
内容はテストしたいjoinメソッドを呼び出してassertEquals(期待する値, 実際の値)で値を比較します。
実際は引数の順番はどちらでも良いのですが見やすさから期待値を第一引数に置くことが多いようです。
あとはパッケージエクスプローラやアウトラインから実行したいテストケースを右クリックして実行からJunitテストを選択することで実行できます。
一つのクラスをまとめて実行指定場合はクラスを選択して上記の手順でまとめて実行できます。
まとめて実行した結果二つ目のテストケースが失敗してしまいました。
期待値と実測値が同じではなかったため失敗したようです、
Junitを使うとエラーの原因も探しやすく、再度実行する場合も便利です。
3. JUnitで使用されるアノテーション@
JUnitでは、テストメソッドを識別し、テストケースのセットアップとクリーンアップを実行するためにアノテーションが使用されます。以下は一般的に使用されるアノテーションの例です。
@Test: テストメソッドを宣言するために使用され、このメソッドがテスト対象であることを示します。
@Before: テストメソッドが実行される前に実行されるメソッドを指定します。
@After: テストメソッドが実行された後に実行されるメソッドを指定します。
@BeforeClass: テストクラス内の全てのテストメソッドが実行される前に実行される静的メソッドを指定します。
@AfterClass: テストクラス内の全てのテストメソッドが実行された後に実行される静的メソッドを指定します。
4. JUnitで使用されるAssertクラス
JUnitのAssertクラスを使用することで、テストケース内で実行結果を評価できます。以下は一般的なアサーションの例です。
- assertEquals(expected, actual): 期待値と実際の値が等しいことを検証します。
- assertTrue(condition): 条件が true であることを検証します。
- assertFalse(condition): 条件が false であることを検証します。
- assertNull(object): オブジェクトが null であることを検証します。
- assertNotNull(object): オブジェクトが null でないことを検証します。
5. Mockについて
単体テストの際には、システム全体をテストするのではなく、単一のモジュールやクラスをテストすることが一般的です。
依存する他のクラスや外部サービスをモック(模擬)することができます。これにより、テストケースがより制御可能になり、単体テストが簡単に行えます。