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ブランチにすでにおいてある。
さて、それぞれ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つの因子(属性)を取り出して見ると可能な組み合わせはすべて網羅されているはずだ。 制約の取り扱いなどを含むもう少し複雑な例もレポジトリにおいてあるので興味のある方は参照してみてほしい。
一点だけ注意。
この例に含まれる@TupleGeneration
アノテーションはメソッドに与えることができるがスタンダードなJCUnitで使う同名のアノテーションとは別物(別パッケージにおいてある。クラスとフィールドにしか付けられない)だ。
0.6.0までの間に統合するかもしれないが、少なくとも今は違うものなので気をつけてほしい。