jcunit's blog

JCUnitの開発日誌(ログ)です。"その時点での"JCUnit作者の理解や考え、開発状況を日本語で書きます。

Theories runner

皆さん、JUnitのTheories runnerは使っていますか? 僕は使っていません。

可能な値の組み合わせをすべて<直積>でテストしようとするのでテストケース数が爆発してしまうのと、 一つのテストメソッドに対してそれらの組み合わせを一つのテストケースとして実行してしまうので、 問題が生じた時に追跡・局所化が難しいと思うからです。

まあそうは言っても、JUnitに最初からバンドルされてるランナーだし、爆発してしまうテストケースを 上手に減らすのはJCUnitの存在意義なので、今日はTheoriesランナーをJCUnitで使う方法を考えてみた。

Theoriesのサポートは次回のリリース(0.5.6)に含まれることになる。

    @RunWith(TheoriesWithJCUnit.class)
    public class TheoriesExample1 {
      @DataPoints("posInt")
      public static int[] positiveIntegers() {
        return new int[] {
        1, 2, 3
        };
      }

      @Theory
      public void test1(
          int a,
          int b,
          int c,
          int d
      ) throws Exception {
        System.out.printf("a=%s, b=%s, c=%d, d=%d%n", a, b, c, d);
      }
    }

この例のソースはJCUnitのレポジトリの0.5.x-developブランチにすでにおいてある。

github.com

さて、それぞれ3つの値を持つ4つのパラメタだ。3 x 3 x 3 x 3=81通りのパターンを実行するのが通常のTheoriesランナー。 しかし、TheoriesWithJCUnitが出力するのは以下の9通りだ。

    a=1, b=1, c=3, d=3
    a=1, b=2, c=2, d=1
    a=1, b=3, c=1, d=2
    a=2, b=1, c=1, d=1
    a=2, b=2, c=3, d=2
    a=2, b=3, c=2, d=3
    a=3, b=1, c=2, d=2
    a=3, b=2, c=1, d=3
    a=3, b=3, c=3, d=1

それでいて、驚くべし、任意の2つの因子(属性)を取り出して見ると可能な組み合わせはすべて網羅されているはずだ。 制約の取り扱いなどを含むもう少し複雑な例もレポジトリにおいてあるので興味のある方は参照してみてほしい。

github.com

一点だけ注意。 この例に含まれる@TupleGenerationアノテーションメソッドに与えることができるがスタンダードなJCUnitで使う同名のアノテーションとは別物(別パッケージにおいてある。クラスとフィールドにしか付けられない)だ。

0.6.0までの間に統合するかもしれないが、少なくとも今は違うものなので気をつけてほしい。