12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

パラメータ化テスト(@Theory)でテストケースとテストデータを紐づける(JUnit4.12〜)

Last updated at Posted at 2016-03-06

前置き

  • 初投稿です。よろしくお願いします。
  • 「JUnit実践入門 ~体系的に学ぶユニットテストの技法」 を読んで要点をまとめました!っていう記事はすでにいっぱいあるんですが、
    これの出版以降のバージョンだと、(すくなくとも日本語での)情報がグッと減るので書いてみる事にしました。
  • パラメータ化テストについては、「JUnit実践入門」では第8章で説明されています。

本題

JUnit4.11まで

  • テストメソッドの引数と@DataPointsが付与されたフィールドとの対応付けは、型でのみ判断されていました。
  • 型が一致すればすべてのテストデータが適用されてしまうので、色々と不自由なところがありました。

JUnit4.12

  • @DataPointsにラベル(複数も可)をつけることができ、
    そのラベルを@FromDataPointsで参照することで、
    テストメソッドの引数とテストデータの対応付けが自由に指定できるようになりました。

ちなみに題材がスネークケースとかキャメルケースとかなのは、「JUnit実践入門」の演習問題の一番最初をやっていたからです。

ParameterizedTest.java
// JUnit4.12の場合
@RunWith(Enclosed.class)
public class ParameterizedTest {

    @RunWith(Theories.class)
    public static class isSnakeCaseのテスト {
        @DataPoints({"snake", "notCamel"})
        public static String[] snakes = new String[] {
            "hello_world", "an_apple_and_a_banana"
        };

        @DataPoints({"camel", "notSnake"})
        public static String[] camels = new String[] {
            "helloWorld", "anAppleAndABanana"
        };

        @DataPoints({"notSnake", "notCamel"})
        public static String[] others = new String[] {
            null, "", "apple"
        };

        // snakesの要素だけが使用される
        @Theory
        public void isSnakeCaseのテスト_trueになる場合(
                @FromDataPoints("snake") String snake) {
            // Exercise & Verify
            assertThat(StringUtils.isSnakeCase(snake), is(true));
        }

        // camelsとothersの要素が使用される
        @Theory
        public void isSnakeCaseのテスト_falseになる場合(
                @FromDataPoints("notSnake") String notSnake) {
            // Exercise & Verify
            assertThat(StringUtils.isSnakeCase(notSnake), is(false));
        }
    }

}

Eclipseでやるとboxingのwarningが出るので、この場合は assertThat() よりもassertTrue()(あるいはassertFalse())を使った方がいいかもしれません。

あとがき

  • 便利そうだけど、実務でどのくらい使えるかはわかんないです。
  • そろそろJUnit4.13とかJUnit5とかも出るんですかね
  • 誤字やおかしいところなどあればご指摘ください。

参考

12
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?