My Photo

« 帰省してキス釣り2012 | Main | JUnit その2:aseertThat()とMatcher API »

August 16, 2012

JUnit その1

JUnit3とJUnit4

現時点での最新版は2011年10月リリースの4.10。
JUnit3もまだかなり使われているようだ。「Androidアプリケーション開発標準資格教科書」にはAndroidのテストフレームワークはJUnit3をベースにしていると書いてある。
JUnit3とJUnit4の相違点はかなり大きい。以下はJUnit4を前提とした内容。

Quick JUnit

Quick JUnitはEclipseのプラグイン。
Ctrl+9 でテスト対象クラスとテストクラスの切り替え、Ctrl+0 でテストの実行ができる。
Eclipseマーケットプレイスからインストールできる。

プロジェクトの準備

JUnitの最新版を使いたい場合はプロジェクトのフォルダにJarファイルを追加し、そのJarファイルのコンテキストメニューで[ビルド・パス]-[ビルド・パスに追加]とする。 Eclipseに付属のJUnitを使う場合は、テストクラスやテストスイートをウィザードで作成するときに自動的にビルドパスに追加される、と思う。
自分が使っているEclipse Indigoには3.8.2、4.8.1、4.8.2があるようだ。

テストコード用のソースフォルダを作る。プロジェクトのコンテキストメニューの[ビルド・パス]-[新規ソースフォルダー、または[新規]-[その他]の[ソースフォルダー]でソースフォルダtestを作成する。
テストクラスはテスト対象と同じパッケージにするあが、置く場所は異なるフォルダにするのがいいらしい。

テストクラスの作成

テスト対象クラスのコンテキストメニューで[新規]-[その他]から[JUnitテスト・ケース]または[JUnitテスト・スイート]を選択してウィザードを使用してテストクラスを作成できる。
また、Quick JUnitではインストール済みの場合はテスト対象クラスをエディタで開きCtrl+9でウィザードが起動する(テストクラスがある場合はテストクラスに切り替わる)。

JUnitのルール

JUnitのテストコードには以下のルールがある。

  • テストクラスはpublicクラス。
  • テストメソッドはorg.junit.Testアノテーションを付与したpublicメソッド。
  • テストメソッドは戻り値がvoidで引数を持たない。
  • パラメータ化テストメソッドはorg.junit.experimental.theories.Theorアノテーションを付与したpublicメソッド
  • パラメータ化テストメソッドは戻り値がvoidで引数を取る。

実測値と期待値の比較にはスタティックメソッド org.junit.Assert#assertThat() を使用する。

public static <T> void assertThat(T actual, org.hamcrest.Matcher<T> matcher)
public static <T> void assertThat(String reason, T actual, org.hamcrest.Matcher<T> matcher)
引数
  reason - エラーについての追加情報
  actual - 実測値(actual value)
  matcher - 期待値との比較を行うMatcherオブジェクト

Matcherオブジェクトはファクトリメソッドで作成する。サンプルコードではis()がファクトリメソッド。

例外が発生することを期待するテストではTestアノテーションのexpected属性に発生する例外クラスのclassをセットする。

テストの実行

テストクラスのコンテキストメニューで[実行]-[JUnitテスト]を選択して実行する。
Quick JUnitではテストメソッド内にカーソルを置いてCtrl+0で実行する。

その他、気付いたこと

JUnitではアノテーションを利用しているが、アノテーションは型なのでimportしないと使えない。
#標準アノテーション(Overrideとか)はimportしなくてもいいみたいだが。java.langパッケージにあるからか?
Version#id()はJUnitのバージョンを返す。

System.out.println("junit version: " + junit.runner.Version.id());

下記は計算機クラス(掛け算・割り算)とそのテストクラス。
参考記事に従ってテストメソッド名を日本語にしてある。わかりやすいが違和感を覚える人もいるかも。

テスト対象クラス
package junit.tutorial;

/**
 * 計算機クラス
 */
public class Calculator {

	public int multiply(int x, int y) {
		return x * y;
	}

	public float divide(int x, int y) {
		if (y == 0) {
			throw new IllegalArgumentException();
		}
		return (float)x /(float)y;
	}
}
テストクラス
package junit.tutorial;

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

import java.util.Date;

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 = 35;	// 35が正しい期待値
		int actual = calc.multiply(5, 7);
		assertThat(actual, is(expected));
	}

	@Test
	public void divideで3と2の除算結果が取得できる() {
		Calculator calc = new Calculator();
		float expected = 1.5f;
		float actual = calc.divide(3, 2);
		assertThat(actual, is(expected));
	}

	@Test(expected = IllegalArgumentException.class)
	public void divideの第2引数に0を指定した場合にはIllegalArgumentExceptionを送出する() {
		Calculator calc = new Calculator();
		calc.divide(5, 0);
	}
	
	@Test
	public void 第3章のカスタムMatcherの確認() {
		assertThat(new Date(), is(dateOf(2012, 1, 12)));
	}
}

参考記事:WEB DB PRESS Vol.69 JUnit実践入門

参考サイト:
JUnit4 - TRANCE ARTS 技術情報Wiki
「テスト駆動開発入門」を JUnit 4.4 と Eclipse 3.3 でやってみる (1)
JUnit4をやってみよう
JUnitメモ(Hishidama's JUnit Memo)

« 帰省してキス釣り2012 | Main | JUnit その2:aseertThat()とMatcher API »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/55437707

Listed below are links to weblogs that reference JUnit その1:

« 帰省してキス釣り2012 | Main | JUnit その2:aseertThat()とMatcher API »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof