本記事について
JUnitって何?レベルの超初心者向けです。
本記事では以下を目標とします。
JUnitについてザックリ理解する。
AssertJのライブラリメソッドを使用して、JUnit(単体テスト)を書けるようになる。
最初のほうは説明文がだらだらと続きますので、
さっさと書き方教えろや!というタイプの人は、先に書き方へ進んでください。
JUnitでテストを実施するには、Java17以降である必要があります。
JUnitってなに
JUnitとは、プログラムが正しく動いているかをチェックするためのフレームワークです。
単体テストをメソッドレベルで行うことができる、ということですね。
JUnitはフレームワーク=枠組みを提供しているのですが、
アサーションメソッドも提供しています。
アサーションメソッドってなに
アサーションとは、この値が期待通りか確認する行為のことを指します。
つまりは、テストを行うということなので、アサーションメソッドとはテスト用のメソッドと理解して大丈夫です。
アサーションメソッドがなくてもテスト自体は書けるのですが、アサーションメソッドを含むJUnitはないと断言してもいいでしょう。
AssertJについて
AssertJとは、アサーションを提供しているJavaのサードパーティライブラリです。
AssertJ is a Java library that provides a rich set of assertions and truly helpful error messages, improves test code readability, and is designed to be super easy to use within your favorite IDE.
🔍「JUnit 書き方」
で検索してトップに出てくるアサーションメソッドは、基本JUnitライブラリが提供しているアサーションのイメージなのですが(私だけでしょうか?)、
現在はAssertJというライブラリが提供しているアサーションメソッドが主流になっているようです。
そのため、本記事では以下の方法でJUnitを書けるようにしたいと思います。
ただ、AssertJはサードパーティライブラリなので、JUnitとは別にmavenなどで追加する必要があります。
追加する方法については公式で記載があるので、そちらをご覧ください。
(リンクを押下すると、記載場所まで飛びます)
フレームワークとして枠組みを提供するJUnitを使用し、
アサーションとして、AssertJというライブラリを使用する
JUnitの基本
先述の通り、JUnitとはテストをするためのフレームワークなので、
通常は本体クラス(テスト対象)があり、対応したテストクラスを作成することになります。
例えばCalcというクラスがあった場合には、CalcTestというテストクラスを作成します。
CalcにあるメソッドをCalcTestを実行することでテストが行われます。
本体クラスとテストクラスは1対1で対応することが多く、ペアで管理することでテストしやすくなります。
作成
Eclipseを使用している場合は、「JUnitテスト・ケース」というウィザードを使用するとテストクラスの雛形を自動作成してくれますが、自分で作成する場合には、元クラス + Test というクラス名にするのが妥当です。
サンプルコード
/**
* 本体(テスト対象)クラス
*/
public class Calc {
// 足し算のメソッド
public int add(int a, int b) {
return a + b;
}
}
/**
* テストクラス
*/
class CalcTest {
@Test //テスト実施メソッドの上に付与
void add() {
Calc calc = new Calc(); // 本体クラスのインスタンスを作成
int result = calc.add(2, 3); // テストしたいメソッドを呼び出して変数に格納する。
assertThat(result).isEqualTo(5); // ※チェックする
}
}
テストクラスの特徴
①@Test が付与されている
② voidメソッドである
③ assertThat(result).isEqualTo(5);というメソッド
本体クラスとテストクラスを見比べてみたときに、
テストクラスの特徴として挙げられるのが上記3点だと思います。
JUnitの基礎となる部分ですので、ひとつずつ解説していきます。
JUnitの書き方
①「@Test」が付与されている
→テストクラスを書くときは必ず、「@Test」を付与しましょう。
@Testとはメソッドがテストメソッドであることを認識させるためのアノテーションです。
反対に、@Testが付与されていないメソッドはテストとして認識されません。
ひとつのクラスにテストしたいメソッドが複数ある場合もそれぞれに付与します。
/**
* テストクラス
*/
class Test {
@Test //必ず付与
void test1() {
// 略
}
@Test
void test2() {
// 略
}
@Test
void test3() {
// 略
}
}
ちなみにJUnit4まではアノテーションに属性をつけていたそうなんですが、
現在はすべて廃止されています。
Denotes that a method is a test method. Unlike JUnit 4’s @Test annotation, this annotation does not declare any attributes, since test extensions in JUnit Jupiter operate based on their own dedicated annotations.
②voidメソッドである
→テストクラスを書くときは必ずvoidメソッドにしましょう。
JUnitは、例外が投げられたかどうかでテストの結果を判断します。
| 例外発生なし | 例外発生あり |
|---|---|
| 成功 | 失敗 |
戻り値があったとしても返す先がないため、voidメソッドとなっています。
ちなみに、戻り値を返したとしてもJUnitは結果を見ることはありません。
公式ガイドにも戻り値を返してはいけない、と記載があります(抽象クラスにすることも禁止されていますね)。
test methods and lifecycle methods must not be abstract and must not return a value
本当は、戻り値を返す@TestFactoryがあるのですが、
基本的にはvoidという認識で問題ありません。
③assertThat(result).isEqualTo(5);というメソッド
通常のコードしか書いたことない人なら「初めまして」のメソッドですね。
これがいわゆるアサーションメソッドというやつです。
今回はAssertJのアサーションメソッドを使用しています。
書き方は以下のとおりです。
assertThat(テストの結果).isEqualTo(期待値);
これは、テストした結果が期待値と同じものが返ってきているかを確認しています。
もう少し詳しい説明
もう一度テストクラスのコードを見返してみましょう。
/**
* テストクラス
*/
class CalcTest {
@Test //テスト実施メソッドの上に付与
void add() {
Calc calc = new Calc(); // 本体クラスのインスタンスを作成
int result = calc.add(2, 3); // テストしたいメソッドを呼び出して変数に格納する。
assertThat(result).isEqualTo(5); // ※チェックする
}
}
今回はresultがテスト対象となっています。
resultにはcalc.addの戻り値が入っています。
calc.addは
public int add(int a, int b) {
return a + b;
}
でした。
テストクラスでの呼び出し時の引数は、2と3ですので、
戻り値として5が期待されるため、isEqualTo(5)と記述しています。
テストクラスが完成したらテストを実行します。
例外が起きなければ、calc.addはきちんと期待値を返すことのできたメソッド、となるわけです。
AssertJのメソッドについて
今回は最もシンプルでわかりやすい、isEqualTo()を使用しましたが、(おそらく王道だとも思います)
AssertJにはたくさんの検証用メソッドがあります。
検証用メソッドについては以下の記事がとても参考になりましたので、皆様もご覧ください。
テストしたい内容に応じて、メソッドを使い分けてください。
ただ、どのメソッドを使用するにおいても基本的にはassertThat(テストしたい結果)から始まります。
例)assertThat(result).isEqualTo(hoge); , assertThat(result).isNull(); etc...
それさえ押さえておけば簡単に使うことができるとおもいます!
最後に
JUnitについて自分自身、1ミリも知らなかったので本記事を作成することで自分の勉強にもなりました。
誰かのお役に立てたら幸いです。
ここまでお読みくださりありがとうございました。
参考文献