Проход по массиву, каждый элемент - тест JUnit - PullRequest
16 голосов
/ 22 ноября 2010

У меня есть тест JUnit 4, который перебирает массив тестовых данных:

public @Test void testAll() {

    final Object[][] sets = new Object[][] {
            // SET                              TYPE VALUE

            // --- valid sets

            // groups
            x(s(A,1, B,1, C,1),                 G),
            x(s(A,4, B,4, D,4),                 G),
            x(s(A,8, B,8, D,8, C,8),            G),
            x(s(J,J, B,4, D,4),                 G,  4*3),
            x(s(A,9, J,J, D,9),                 G,  9*3),
            x(s(A,2, B,2, C,2),                 G),
            x(s(A,4, B,4, J,J),                 G,  4*3),
            x(s(A,4, B,4, C,4, D,4),            G),

            // runs
            x(s(A,1, A,2, A,3),                 R),
            x(s(B,8, B,9, B,10),                R),
            x(s(J,J, C,2, C,3),                 R,  6),
            x(s(D,8, D,9, J,J, D,11),           R,  38),
            x(s(D,8, D,9, J,J, J,J),            R,  38),

            // sames
            x(s(A,1, A,1),                      S),
            x(s(B,4, B,4, B,4),                 S),
            x(s(C,8, C,8),                      S),
            x(s(D,3, D,3),                      S),

            // doubt-cases, assume group (TODO: verify this is correct)
            x(s(J,J, J,J, D,4),                 G,  4*3),
            x(s(A,7, J,J, J,J),                 G,  7*3),
            x(s(J,J, D,9, J,J),                 G,  9*3),
            x(s(J,J, J,J, J,J),                 G,  1),

            // --- invalid sets
            x(s(B,1, A,2, A,3),                 I), // not same colour
            x(s(D,11, D,12, J,J, J,J),          I), // last joker is 14
            x(s(B,1, B,1, A,1),                 I), // duplicate B1
            x(s(A,1, A,2, A,3, A,5),            I), // gap A4
            x(s(J,J, A,1, J,J, B,1, C,1),       I), // one J replaces D1, then nothing left to replace
            x(s(A,1, A,2),                      I), // short
            x(s(B,1),                           I), // shorter
            x(s(A,5, A,6),                      I), // short
    };

    for (Object[] o : sets) {

        TileSet s = (TileSet) o[0];
        Type t = (Type) o[1];
        int v = (Integer) o[2];

        System.out.println(s);

        assertEquals(t, s.getType());
        assertEquals(v, s.getValue());

        // test isValid, though it's Too Simple To Break(R)
        if (t == Type.INVALID) assertFalse(s.isValid());
        else assertTrue(s.isValid());
    }

}

Поскольку это все в одном тестовом методе, весь тест останавливается, как только один элемент в массиве дает сбой.Есть ли способ обойти это, не создавая метод для каждого тестового элемента?Может быть, что-то с отражением?

Ответы [ 2 ]

22 голосов
/ 22 ноября 2010

Используйте параметризованные тесты JUnit 4 .Они идеально подходят для такого рода проблем, хотя документации не хватает.

Вот несколько других примеров их использования.1009 *

http://isagoksu.com/2009/development/agile-development/test-driven-development/using-junit-parameterized-annotation/ http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/
4 голосов
/ 22 ноября 2010

catch AssertionError и добавить обнаруженную ошибку в список ошибок, в конце проверить, чтобы список был пустым, поднять составную AssertionError, если нет.

...