疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】JUnitでテスト

今回はJUnitに関する記事になります。
仕事上テストする機会も増えてきたので自分なりにまとめてみます。

まず、JUnitは単体テストを行うフレームワークです。
Javaを触っている方なら耳にする機会も多いと思います。
単体テストとは、作成したプログラムが意図した動作をするか機能ごとに検証することを言います。

私自身、JUnitに関してはほぼ知識ゼロでした。
似たようなところでDJUnitというものもあるのですが、そっちを少しさわったことがあるくらい。


では実際にテストしてみます。
事前準備としてコチラからJUnitのjarをダウンロードします。
リンクに飛んだらすぐダウンロードされるので注意。

ダウンロードしたjarを、使用するプロジェクトでビルドパス通しておきましょう。
プロジェクトを右クリック→「ビルド・パス」→「ビルド・パスの構成」と進んでいきます。

f:id:chibiCat:20181111191625p:plain:w350

外部jarの追加をクリックし、ダウンロードしたjarを選択→Open。

f:id:chibiCat:20181111191620p:plain:w350

あとは適用して閉じればOKです。
参照ライブラリーにjarが追加されていれば完了。

f:id:chibiCat:20181111191613p:plain:w350


次にテスト対象となるソースを用意します。
今回は計算を行うクラスのテストを行ってみます。

Main.java

public class Main {
	public static void main(String[] args) {

		Calc calc = new Calc();
		int value = calc.sum(4, 7);

		System.out.println("足し算の結果は" + value);
	}
}

Calc.java

public class Calc {

	public int sum(int a, int b) {
		return a + b;
	}

	public int diff(int a, int b) {
		return a - b;
	}
}

Calcが計算を行うクラスですね。
Mainがそれを実際に使用しています。

では、Calcのテストを行ってみましょう。
まずはCalc.javaを右クリック→新規→その他をクリック。

f:id:chibiCat:20181111184547p:plain:w350

「JUnit」と入力し「JUnit テスト・ケース」を選択し次へ。

f:id:chibiCat:20181111184543p:plain:w350

あとはとりあえずデフォルトのまま完了でOKです。

f:id:chibiCat:20181111184539p:plain:w350

そして作成されたテストクラスが以下のようになっています。

f:id:chibiCat:20181111184535p:plain:w350

ここに自分でテストコードを書いていきます。
「@Test」というアノテーションを付与することでJUnitがテストメソッドであることを認識できます。
ちなみにテストメソッドはpublic voidである必要があるみたいです。

1つテストを実装してみます。

CalcTest.java

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class CalcTest {

	@Test
	public void sum_test01() {
		int TEST_VALUE1 = 1;
		int TEST_VALUE2 = 3;
		int EXP_VALUE = 4;

		Calc calc = new Calc();
		int result = calc.sum(TEST_VALUE1, TEST_VALUE2);

		assertThat(result, is(EXP_VALUE));
	}
}

このテストでは、まず引数として指定する値をTEST_VALUE、期待値をEXP_VALUEで用意しています。
その後、実際にテストしたいメソッドを呼び出して処理を行います。
最後にassertThatメソッドで処理結果と期待値を比較します。

テストの実行方法は、テストクラスを右クリック→「実行」→「JUnitテスト」でOK。

f:id:chibiCat:20181111184531p:plain:w350

実行結果はJUnitのウィンドウで表示されます。

f:id:chibiCat:20181111184648p:plain:w350

緑色のゲージはテストが成功していることを示します。

テストの一連の流れなこんな感じです。
あとは補足と言うか、ちょっと細かい話とか。


テスト観点について少しお話をします。
上記のテストはsumメソッドに対するテストのほんの一部です。
実際には、引数に0や負の数を与えた時の挙動を見るテストも必要になってきます。

場合によってはテストケースが無限に考えられる場合もあると思います。
基本的には上限と下限、そして0やnullのテストは必須と言えるでしょう。
地道ではありますが、ここで単体テストの品質を高めておくことで結合テストもスムーズに行えるはずです。


続いて私の個人的な思いのお話。
今回紹介したテストもそうなんですけど、そんな当たり前なテストって意味あるの?って最初の頃は思っていました。

でも実際はもっと複雑なメソッドをテストしなければいけません。
例えば、メソッドの中でメソッドを呼んでいて、さらにその中でも他のメソッドを呼んでいたりすると期待値がわかりづらく大変です。
そんな時にJUnitで結果が期待通りかを試せるのはとても便利です。


まだまだテストは奥が深いので、JUnitの記事第2弾を書く予定でいます。
今回は以上になります。