JUnit実践入門 1日目(テストコードの作成〜実行まで)

JUnitとは:Javaのテスティングフレームワーク
役割
・テスト実行フレームワーク
・テストの期待値と実測値の検証
・テストケースのフォーマット
→どのようにテストを記述して、実行し、検証するかをサポートしてくれる。

テスト対象のクラスを作成する。

package junit.tutorial;
public class Calculator {
	public int multiply(int x, int y) {
		return x * y;
	}
	public int divide(int x, int y) {
		return x /y;
	}
}

f:id:Uzms:20180804191335p:plain

testソースフォルダの作成
→一般的にテスト対象と異なるソースフォルダに作成する。
 今回はプロジェクト直下に作成。

テストクラスの作成
f:id:Uzms:20180804194540p:plain
f:id:Uzms:20180804194604p:plainf:id:Uzms:20180804194609p:plain

以下のテストクラスが作成される

package junit.tutorial;

import static org.junit.Assert.*;

import org.junit.Test;

public class CaluculatorTest {

	@Test
	public void test() {
		fail("まだ実装されていません");
	}
}

Quick JUnitの利用
キー入力無しでテストクラスが生成できる。メッチャ便利。
プロジェクトのテスト対象クラスを右クリックー実行ーJunitテスト
f:id:Uzms:20180804202048p:plain

テストコードのルール
・テストクラスはpublicクラス
・テストメソッドはTestアノテーションを付与したpublicメソッド
・テストメソッドは戻り値がvoidであり、引数を持たない
・thorow句は自由に定義可能
→自動生成したテストクラスでは上記のルールに沿った形式でテンプレートが作られているので意識しなくともルールに乗っ取った形で作成できるが、エラーの原因となりかねるのでしっかりと覚えておくこと。


生成されたテストコードを実行するとエラーが発生。
jarファイルが足りないらしいので追加。
JUnit4.11にしたら、Hamcrestが無いってエラーが出たよ・・・

追加するとエラーが解消され、コードが実行された。

                                                                                                            • -

テストメソッドを日本語で書く(!?)
昔から議論が行われている模様。
曖昧さはなくなりそうなので導入して見たい。
→複数人で開発を実施する際には最初に決め事とすべきか。

                                                                                                            • -

実際に作成したテスト対象クラスを実行するようにテストコードを作成。

package junit.tutorial;

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

import org.junit.Test;

public class CalculatorTest {

	@Test
	public void multiplyで乗算結果が取得できる() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		assertThat(actual, is(expected));
	}
}

作成したテストコードを実行して見ると、JUnitのViewの障害トレースにエラーログが表示されず、グリーンバーが表示された。
これでテストコードとしてはテスト成功を意味している。
f:id:Uzms:20180804221542p:plain

ただ、テストコードは成功したが、実際のテストとしては網羅していないパターンがまだあるはずなので
テストコードをさらに追加する。

追加するテストパターン:5と7の乗算

package junit.tutorial;

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

import org.junit.Test;

public class CalculatorTest {

	@Test
	public void multiplyで3と4の乗算結果が取得できる() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		assertThat(actual, is(expected));
	}
	
	@Test
	public void multiplyで5と7の乗算結果が取得できる() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(5, 7);
		assertThat(actual, is(expected));
	}
}

この状態で実行するとmultiplyで5と7の乗算結果が取得できる()メソッドがエラーとなる
→原因としてはassertThatメソッドで第一引数に指定しているactualの値を変更していないため。
エラーログには下記の情報が表示される。
Expected:期待された値
   got:実際の値
f:id:Uzms:20180804222647p:plain

このようにして、ユニットテストでは1つのメソッドに対して複数のテストを実施して精度を高めていく。