6

我有以下 JUnit 测试。我正在测试的方法非常简单,它只接收一个数字并返回一个带有除数的列表。我不想多次重复测试代码,所以我创建了一个辅助方法,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));
    }
}

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

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

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

4

2 回答 2

5

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

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

于 2010-09-06T20:55:06.690 回答
0

正如 Adam Butler 所建议的,有一个以 assert 开头的方法将解决这个警告。

因此,在您的情况下,将 testDivisorsAux 重命名为 assertDivisorsAux 将修复它。

有关检查规则的代码,另请参见http://pmd.sourceforge.net/pmd-4.3.0/xref/net/sourceforge/pmd/rules/junit/JUnitTestsShouldContainAsserts.html 。

于 2014-10-09T12:29:23.427 回答