2012/07/27

JUnit3 で Parameterized test case (2)

昨日、JUnit3 で Parameterized test case (1) というエントリを書いたのですが、その後いろいろいじっていると、ちょっと不満が出てきたので改造してみました。

本日のコードも以下にアップしてありますので、ご自由にお使いください。
JUnit3Experiment_02.zip

昨日の問題点

一番の不満は、テストを走らせるときに、AllTests.java を選択してから走らせなければならないということ。
「全部走らせる」 = 「プロジェクトを選択して Run」 が Eclipse っぽいような気がします。


ちなみに、Configuration は以下のようになっています。
クラス直指定は何となく、特定のテストだけ走らせるという感じがするのは私だけでしょうか?

改善方法

TestSuitesuite() という static method を持っていれば良いようです。
そして、各プロジェクトに一つという制約はありません。
そのため、AllTest というクラスを作る必要はなく、各テストケースに suite() を用意することで、上記の問題を回避することが出来ます。

具体的には、AllTest.java を削除して、CalcTwiceTest.java, CalcSquareTest.java を以下のように書き換えます。
コードの解説は昨日のエントリを参照してください。

CalcTwiceTest.java
public class CalcTwiceTest extends TestCase {
    // Test Data
    // 本当はFile等から取り込む
    private static int[][] sTwiceTestData = {
            {5, 10},
            {8, 16},
            {20, 40},
            {21, 42},
            {103, 206}
    };

    public static Test suite() {
        TestSuite suite = new TestSuite(CalcTwiceTest.class.getName());
        //$JUnit-BEGIN$
        for (int i = 0; i < sTwiceTestData.length; i++) {
            suite.addTest(new CalcTwiceTest(i, sTwiceTestData[i][1], sTwiceTestData[i][0]));
        }
        //$JUnit-END$
        return suite;
    }

    private final int mExpected;
    private final int mInput;

    CalcTwiceTest(int number, int expected, int input) {
        // Test name must be unique
        super("TwiceTest " + number);

        mExpected = expected;
        mInput = input;
    }

    @Override
    protected void runTest() throws Throwable {
        int result = MyUtils.calcTwice(mInput);
        assertEquals("input " + mInput, mExpected, result);
    }
}

CalcSquareTest.java
public class CalcSquareTest extends TestCase {
    // Test Data
    // 本当はFile等から取り込む
    private static int[][] sSquareTestData = {
        {5, 25},
        {8, 64},
        {20, 400},
        {21, 441},
        {103, 10609}
    };

    public static Test suite() {
        TestSuite suite = new TestSuite(CalcSquareTest.class.getName());
        //$JUnit-BEGIN$
        for (int i = 0; i < sSquareTestData.length; i++) {
            suite.addTest(new CalcSquareTest(i, sSquareTestData[i][1], sSquareTestData[i][0]));
        }
        //$JUnit-END$
        return suite;
    }


    private final int mExpected;
    private final int mInput;

    CalcSquareTest(int number, int expected, int input) {
        // Test name must be unique
        super("SquareTest " + number);

        mExpected = expected;
        mInput = input;
    }

    @Override
    protected void runTest() throws Throwable {
        int result = MyUtils.calcSquare(mInput);
        assertEquals("input " + mInput, mExpected, result);
    }
}

テストの実行

プロジェクトを選択して Run。
Configuration は以下のようになります。
やはり、Run all tests が選択されている方がしっくりきます。(私だけですかねぇ?)

実行した結果は、以下のようになりました。

以下は、昨日作成の結果です。

2つを見比べると、本日のものは、各テストケースが独立して扱われるようになったので、より見やすくなったように思います。
また、各テストケースを選択して独立して走らせることも可能になりました。
JUnit4 の形式にも近づいて、やはりこちらの方が良いかなと思います。

0 件のコメント: