循环遍历数组,每个元素都进行一次JUnit测试

时间:2010-11-22 16:53:13

标签: java unit-testing junit assert junit4

我有一个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());
    }

}

因为它只在一个测试方法中,所以只要数组中的一个元素失败,整个测试就会停止。有没有解决方法,没有为每个测试项目制作方法? 也许有反思的东西?

3 个答案:

答案 0 :(得分:22)

答案 1 :(得分:4)

捕获AssertionError并将捕获的错误添加到错误列表中,最后检查列表是否为空,如果没有,则引发化合物AssertionError

答案 2 :(得分:0)

我认为

JUnit 5 中的参数化测试 使用更好的语法变得更容易了。你可以阅读它here。其中一个选项是声明一个方法来提供要测试的参数列表,如下所示:

// Given
private static Stream<Arguments> shouldReturnExpectedResultWhenGivenRightInput() {
   return Stream.of(
       Arguments.of(3, "Fizz"),
       Arguments.of(5, "Buzz"),
       Arguments.of(8, "8"),
       Arguments.of(15, "FizzBuzz"),
       Arguments.of(19, "19"),
       Arguments.of(30, "FizzBuzz"),
       Arguments.of(40, "Buzz"),
       Arguments.of(45, "FizzBuzz")
   );
}
@ParameterizedTest
@MethodSource
void shouldReturnExpectedResultWhenGivenRightInput(Integer input, String expected) {
   // When
   val result = library.processInput(input); 
   // Then
   assertEquals(expected, result);
}

// Given
private static Stream<Arguments> shouldNotReturnExpectedResultWhenGivenWrongInput() {
    return Stream.of(
        Arguments.of(3, "Buzz"),
        Arguments.of(5, "Fizz"),
        Arguments.of(8, "Buzz"),
        Arguments.of(15, "15"),
        Arguments.of(19, "Fizz")
    );
}
@ParameterizedTest
@MethodSource
void shouldNotReturnExpectedResultWhenGivenWrongInput(Integer input, String unexpected) {
    // When
    val result = library.processInput(input); 
    // Then
    assertNotEquals(unexpected, result);
}