【问题标题】:Loop through array, each element a JUnit test遍历数组,每个元素一个 JUnit 测试
【发布时间】:2010-11-22 16:53:13
【问题描述】:

我有一个循环遍历一组测试数据的 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());
    }

}

因为这一切都在一个测试方法中,所以一旦数组中的一个元素失败,整个测试就会停止。有没有办法解决这个问题,而不为每个测试项目制定方法? 也许有反射的东西?

【问题讨论】:

  • 如果您需要它继续断言失败,那么如何在循环时建立一个失败的元素列表,然后在循环后断言该列表为空?如果不为空,则打印出失败列表。
  • @birryree 你会怎么做呢?一旦元素失败,循环不会停止吗?顺便说一句,我是初学者。

标签: java unit-testing junit assert junit4


【解决方案1】:

【讨论】:

  • 这正是我所需要的。不过有一件事,有没有办法在测试结果中显示测试数据的 toString() ?必须通过数组索引继续查找它们很不方便。
  • 您可能想要研究子类化参数化运行器或提供您自己的实现并覆盖内部类 TestClassRunnerForParameters 中的 getName() 方法
  • 在 (@Test) 方法级别上是否可能发生这样的事情?我只想重复类中的一些方法,并且我已经将@RunWith 用于其他内容。
  • 有没有办法在不依赖静态参数的情况下做到这一点?我正在为我的参数使用一些随机数据生成...
【解决方案2】:

捕获AssertionError 并将捕获的错误添加到错误列表中,最后检查列表是否为空,如果不是,请提出复合AssertionError

【讨论】:

  • 错误列表?这只是我必须制作的列表,还是内置的 JUnit 东西?
  • @Bart 你必须成功。顺便说一句,在setUp 中实例化测试数据并制作小的test... 方法是一个好习惯。
  • 我知道,但是我有太多的测试数据(目前有的会更多)。
【解决方案3】:
我认为,

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多