JUnitチュートリアル

アジャイルソフトウェア開発の奥義 第2版

アジャイルソフトウェア開発の奥義 第2版

  • 作者: ロバート・C・マーチン,Robert C. Martin,瀬谷啓介
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2008/07/01
  • メディア: 単行本
  • 購入: 18人 クリック: 586回
  • この商品を含むブログ (71件) を見る

内容

JUnitとは何なのか、JUnitでユニットテストの実行をしてみる。

環境

JDK8
Eclipse(Neon)
macOS

プロジェクトの準備

ファイル
→新規
→Javaプロジェクト
→junit-tutorialを作成

通常はテストコードとプロダクションコードは別のソースフォルダに配置する。
このため、テストコードを作成するためのソースフォルダ「test」を作成する。

f:id:sattamassagana:20170225221829p:plain

プロジェクトのコンテキストメニューから
→ビルドパス
→新規ソースフォルダを選択
→フォルダ名を「test」にする

テスト対象クラスの作成

■テストクラス
テストプログラムを記述するクラス
■テスト対象クラス
テストされるクラス
下記のようなクラスを作成する。これがテスト対象クラス。
Calculator.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;
			}
}

テストクラスの作成

パッケージエクスプローラーで右クリック
→新規
→JUit
→JUnit Test Case
ソースフォルダをjunit-tutorial/testにする
テスト元クラスをjunit.tutorial.Calculatorにする

下記のようなクラスが作成される。これがテストクラス。
CalculatorTest.java

package junit.tutorial;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest {

	@Test
	public void test() {
		fail("Not yet implemented");
	}

}

テストの実行

この段階ではまだテストが実装されていないが、一旦実行してみる。
CalculatorTestのコンテキストメニューから実行-JUnitテストを選択する。
f:id:sattamassagana:20170226205003p:plain
1件のテストを実行し、1件が失敗したことを確認できる。

乗算メソッドのテストコードを書く

テストメソッドを作成するときは、はじめにそのテストで何を検証したいのかを検証する。
ここでは「テスト対象クラスのmultiplyメソッドで乗算結果が取得できる」ことを検証する。

  • JUnitのルールに注意する
    • テストクラスはpublicクラスとする
    • テストメソッドはorg.junit.Testアノテーションを付与したpublicメソッドとする
    • テストメソッドは戻り値がvoidであり、引数を持たない
    • テストメソッドのthrows句は自由に定義できる
    • テストクラスにはいくつでもテストメソッドを定義できる
    • テストメソッド名は、そのテストの概要がわかる名前にする

まずは「3と4を引数としてmultiplyメソッドを実行し、取得された値が12である」ことを検証する。

CalculatorTest.java

package junit.tutorial;

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

public class CalculatorTest {

//	@Test
//	public void test() {
//		fail("Not yet implemented");
//	}

	// テストコードの追加
	@Test
	public void multiplyTest() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		//JUnitではorg.junit.AssertクラスのassertThatメソッドを使って
		//「あるテスト対象クラスのメソッドを実行したときに、戻り値などで取得した
		//実際の値と、期待される値が一致する/しないはずである」という宣言で構成される(アサーション)
               //assertThatはAssertクラスに定義sれたstaticメソッド。1つめの引数が実測値、2つめの引数が期待値。
		assertThat(actual, is(expected));
	}

}

実行する
f:id:sattamassagana:20170226212110p:plain
実行1、エラー0、失敗0となった。
また、グリーンバーになっている。
これで「3と4を引数としてmultiplyメソッドを実行し、取得された値が12である」ことが確認できた。

2つめのテストを追加する

テストが失敗した場合の動作を確認してみる。
CalculatorTest.java

package junit.tutorial;

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

public class CalculatorTest {
	@Test
	public void multiplyTest() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		assertThat(actual, is(expected));
	}
  //テストコード追加その2
	@Test
	public void multiplyTest5x7equals35() {
		Calculator calc = new Calculator();
		int expected = 12;//35が正しい期待値
		int actual = calc.multiply(5, 7);
		assertThat(actual, is(expected));
	}

}

これを実行するとテストが失敗する。
AssertionErrorに「期待値が<12>なのに<35>でした。」とのメッセージ。
f:id:sattamassagana:20170304174806p:plain
Failure Traceにはテスト失敗時のスタックトレースが表示されており、行を
ダブルクリックすることでそのクラスのソース箇所に移動できる。
今回はテストコードの方に不具合があるため、これを修正して再度実行する。
CalculatorTest.java

package junit.tutorial;

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

public class CalculatorTest {
	@Test
	public void multiplyTest() {
		Calculator calc = new Calculator();
		int expected = 12;
		int actual = calc.multiply(3, 4);
		assertThat(actual, is(expected));
	}

	@Test
	public void multiplyTest5x7equals35() {
		Calculator calc = new Calculator();
		int expected = 35;//テストコードを修正
		int actual = calc.multiply(5, 7);
		assertThat(actual, is(expected));
	}

}

f:id:sattamassagana:20170304173950p:plain
2つともグリーン。