我应该在JUnit中拆分重用方法吗?
我有以下的JUnit测试。我正在测试的方法非常简单,只是接收一个数字并返回带有除数的List。我不想重复测试代码很多次,所以我创建了一个附配的方法,testDivisorsAux
:我应该在JUnit中拆分重用方法吗?
@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测试应包括断言()或失败()(对于第一方法),并且执行测试JUnit 4测试应该使用@Test注解(用于第二个) 。我知道PMD正在使用一个正则表达式(呃,实际上它是XPath)来确定我正在打破哪个规则 ...所以我倾向于认为这只是一个“误报”警告。但无论如何,我想知道我是否做错了什么。 (公寓从写作测试4倍的时间比被测试的方法:)
虽然我在寻找类似于这个问题,我发现了一种叫做参数化测试 ...但它似乎是面向更大的场景,不是吗?
我个人认为它是好做法做到这一点。有一个小小的危险,就是过多的构建大量的代码来做测试,在这种情况下,你应该重新考虑你正在测试的东西的设计。你并不是真的想写测试来测试你的测试,但是你给出的例子看起来很好,这意味着你的测试用例要简单得多。
我没有使用PMD,我个人会尝试将它配置为ingore这些警告。如果他们担心你可能会改变你的代码来摆脱它们。我的猜测是,第二个警告是因为你的辅助方法以单词测试开始。在junit3中,所有以测试开始的方法都是测试。为什么不重命名方法testDivisorsAux为assertDivisors - 也许有一个以assert开头的方法也会帮助第一个警告。
亚当巴特勒建议,有一个方法以assert开始将解决此警告。
因此,你的情况,重命名testDivisorsAux assertDivisorsAux将修复它。
另请参阅http://pmd.sourceforge.net/pmd-4.3.0/xref/net/sourceforge/pmd/rules/junit/JUnitTestsShouldContainAsserts.html以了解检查规则的代码。
非常感谢您的回答@Adam。我并不是很担心PMD的警告,但无论如何都是避免它们的好方法! :)不仅是一个很好的窍门,我认为你提出的名字也比我的更具描述性...... – AJPerez 2010-09-07 06:05:25