我应该在JUnit中拆分重用方法吗?

AJP*_*rez 6 junit pmd

我有以下JUnit测试.我正在测试的方法很简单,它只接收一个数字并返回一个带有除数的List.我不想多次重复测试代码,所以我创建了一个辅助方法,testDivisorsAux:

@Test
public final void testDivisors() {
    testDivisorsAux(1, new int[] { 1 });
    testDivisorsAux(6, new int[] { 1, 2, 3, 6 });
    testDivisorsAux(0, new int[] { });
    ...
}

private final void testDivisorsAux(final int number, final int[] expected) {
    List<Integer> divisors = Util.divisors(number);
    assertSame(divisors.size(), expected.length);
    for (int i : expected) {
        assertTrue(divisors.contains(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

一切正常,我只是想知道...... 这是一个不好的做法吗?我应该以不同的方式编写测试吗?也许将所有代码保留在" @Test方法"中?

PMD告诉我JUnit测试应该包括assert()或fail()(对于第一个方法),执行测试的JUnit 4测试应该使用@Test注释(对于第二个).我知道PMD只使用正则表达式(好吧,实际上是XPath)来确定我正在破坏哪些规则......所以我倾向于认为它只是一个"误报"警告.但无论如何,我想知道我做错了什么.(公寓写作测试的时间比测试方法长4倍:)

当我在寻找类似于这个的问题时,我发现了一些叫做参数化测试的东西......但它似乎是面向更大场景的东西,不是吗?

Ada*_*ler 5

我个人认为这样做好习惯.存在一个很小的危险,即走得太远并构建大量代码来进行测试,在这种情况下,您应该重新考虑您正在测试的东西的设计.您真的不想编写测试来测试您的测试,但您提供的示例似乎很好,这意味着您的测试用例要简单得多.

我没有使用PMD,我个人会尝试配置它来加入这些警告.如果他们担心你,你可以改变你的代码来摆脱它们.我的猜测是第二个警告是因为你的辅助方法以单词test开头.在junit3中,所有以test开头的方法都是测试.为什么不将方法testDivisorsAux重命名为assertDivisors - 也许有一个以assert开头的方法也有助于第一个警告.