JUnit4 の Enclosed を使ったテストクラスサンプル

公開日: : 最終更新日:2015/08/02 JUnit4 ,

JUnit 本である「JUnit実践入門」を読んでいます。
体系的にまとめられている良書で、勉強になること盛りだくさんです。

盛りだくさんすぎて覚えられないので、今後実際に使ってみたい機能をピックアップしていきます。
今回は Enclosed を使ったテストのグループ化です。

目次

1. Enclosed によるテストケースのグループ化

1-1. Enclosed のメリット

JUnit実践入門 にあったテストケースのグループ化によるメリットを引用しておきます。

テストクラスのテストケースが増えてきた場合に、同じ特徴を持つテストケースをまとめ、構造化できます(P86)

同じ初期化処理を行うテストケースをまとめることができるため、可読性の高いテストコードを作成できるようになります(P86)

ボク自身これまで JUnit3.8 をメインに使ってテストを書いていて、似たようなテストケースを集めてコメントで区切ってグループ化してました。
構造化というほど大げさなものではないですが、似たものを集めておくことはしていました。

なぜそのようにしていたのかというと、テストの読みやすさを保つためと、あとはいろいろ忘れてしまうからです。
テストを作成したときはどんなテストを書いたのかなどを覚えていますが、一週間も経つと忘れてしまうのでコメントを残してテスト内容などをメモするようにしていました。
例えば、こんな感じです。

// 【ここから】○○に関するテスト
  :
  :
// 【ここまで】○○に関するテスト

// 【ここから】△△に関するテスト
  :
  :
// 【ここまで】△△に関するテスト

このやり方だと、正しくない箇所にテストケースを追加できてしまうっていう不満があってモヤモヤしていたのですが、Enclosed でグループ化することで解消できそうだなっていう点にメリットを感じています。

1-2. グループ化のパターン

JUnit実践入門 に、どういう単位でグループ化したらいいかというヒントがあったので、これも引用させてもらいます(カッコ内はボクの理解や補足)。

  • 共通のデータに着目する(テストで使用するテストデータでグループ分けする)
  • 共通の状態に着目する(テスト対象クラスの事前処理でグループ分けする)
  • コンストラクタのテストを分ける(コンストラクタのテストだけでグループ分けする)

2. @RunWith(Enclosed.class) を使ってテストを書いてみる

この記事の目的は、Enclosed を使ったテストクラスのひな形を残しておいて、必要なときにサッと参照しやすくするってことなので、サンプルを書いてみました。

2-1. 動作環境

動作環境は次の通りです。
まずは Java のバージョン。

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

JUnit は 2013/08/26 時点での最新である 4.11 を使いました。

JAR のダウンロードですが、Maven であれば次の dependency を pom.xml に貼り付けます。

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

その後、次のコマンドを実行すればローカルリポジトリに JAR がダウンロードされます。

$ mvn eclipse:eclipse -DdownloadSources=true

また Maven を使わずに JAR を直接ダウンロードしてプロジェクトに組み込む場合は次のサイトからダウンロードできます。
ダウンロードページの URL は次になります。

2-2. 動作確認に使ったテスト対象クラス

動作確認用に、整数の足し算を行うメソッドを作成しました。
コードは次の通りになります。

package net.tomoyamkung.etc;

public class NumberUtil {
    public static int add(int i, int j) {
        return i + j;
    }
}

2-3. 作成したテストクラス

グループ分けする static class は次の3つとしました。
テストで使用するテストデータでグループ分けしたパターンになります。

  1. 正の整数同士で足す場合
    1-1. 1ケタ同士の足し算
    1-2. 1ケタと2ケタの整数の足し算
  2. ゼロがあった場合
    2-1. 0 と正の整数での足し算
    2-2. 0 と負の整数での足し算
  3. 負の整数同士で足す場合
    3-1. 1ケタ同士の足し算
    3-2. 1ケタと2ケタの整数の足し算

コードは次の通りになります。

package net.tomoyamkung.etc;

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

import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;

@RunWith(Enclosed.class)
public class NumberUtilTest {

    public static class 正の整数同士の場合 {

        @Test
        public void ひとケタ同士の足し算() throws Exception {
            // Exercise
            int actual = NumberUtil.add(1, 2);
            // Verify
            assertThat(actual, is(3)); 
        }

        @Test
        public void ひとケタとふたケタの足し算() throws Exception {
            // Exercise
            int actual = NumberUtil.add(1, 10);
            // Verify
            assertThat(actual, is(11)); 
        }
    }

    public static class ゼロが含んだ場合 {

        @Test
        public void ゼロと正の整数の足し算() throws Exception {
            // Exercise
            int actual = NumberUtil.add(1, 0);
            // Verify
            assertThat(actual, is(1)); 
        }

        @Test
        public void ゼロと負の整数の足し算() throws Exception {
            // Exercise
            int actual = NumberUtil.add(0, -1);
            // Verify
            assertThat(actual, is(-1)); 
        }
    }

    public static class 負の整数同士の場合 {

        @Test
        public void ひとケタ同士の足し算() throws Exception {
            // Exercise
            int actual = NumberUtil.add(-1, -2);
            // Verify
            assertThat(actual, is(-3)); 
        }

        @Test
        public void ひとケタとふたケタの足し算() throws Exception {
            // Exercise
            int actual = NumberUtil.add(-1, -10);
            // Verify
            assertThat(actual, is(-11)); 
        }
    }
}

3. まとめ

上記の例には static class ごとに @Before でテスト対象クラスの初期化処理を行ったり、テストデータを作成する部分が欠けていますので、その辺りも漏れなく実装すればいい感じにグループ分けできるなぁと思っています。

あとは、メソッド名を日本語にするとか、コメントを残すといった「これは○○をしています」的なことがサッと理解できるようにしておくことが大事だなぁといったところでしょうか。

というわけで非常におすすめです。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-8536919558_0e01e5dc77-thumbnail

JUnit4 で JavaBeans の assertThat を簡潔に書きたい

今回も JUnit ネタです。 前回は List の assertThat を簡潔に書く方法につい

記事を読む

junit-logo

JUnit4 のパラメータ化テストは4通りの方法で書ける

JUnit 本である「JUnit実践入門」でテストの書き方を勉強しています。 本書でも紹介されている

記事を読む

junit-logo

JUnit4 で List の assertThat を簡潔に書きたい

Java でプログラムを書くときは、プライベート・仕事を問わず JUnit を使ってユニットテストを

記事を読む

Googleアドセンス用(PC)

Comment

  1. 名前なし より:

    素晴らしいです。

    テストケースが決まったら、それに沿ってテストデータを用意しなければなりません。
    普段テストデータにコード値や区分値などがあります。それはテストケースの組み合わせパターンを決めます。
    データの組み合わせのパターンを決めてからテストケースを書くのも多いです。

    品質のよいテストをするために、品質のよいデータを使わなければなりません。

    下記のソフトは大量データの組み合わせパターンの作成ができます
    またExcelで60種類以上の本番擬似テストデータを生成して、
    そのままExcelシートからOracleやMySQLなど複数のデータベースへ登録できます。
    大量のテストデータ自動生成にはとても便利です。

    ExcelDBTool(ExcelでDB検索更新データ作成)
    http://www.vector.co.jp/soft/winnt/business/se475115.html

    ExcelDevTool(エクセル機能拡張でパワーアップ)
    http://www.vector.co.jp/soft/winnt/business/se475869.html

    http://www.superdbtool.com

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


× 三 = 15

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑