2010-09-06 3 views
6

У меня есть следующий тест JUnit. Метод, который я тестирую, довольно прост, он просто получает число и возвращает список с его делителями. Я не хочу повторять тест код много раз, поэтому я создал метод ДОПОЛНИТЕЛЬНОГО, 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 тесты должны включать Assert() или не() (первый метод), и JUnit 4 тестов, которые выполняют тесты должны использовать @test аннотацию (для второго) , Я знаю, что PMD использует только регулярное выражение (ну, на самом деле это XPath), чтобы определить, какие правила я нарушает ... поэтому я склонен думать, что это просто «ложноположительное» предупреждение. Но в любом случае, я хотел бы знать, что я делаю что-то неправильно. (Appart от написания тестов в 4 раза дольше, чем тестируемый метод :)

Пока я искал вопросы, подобные этому, я нашел что-то под названием параметризованных тестов ... но, похоже, это что-то ориентированное гораздо больше сценариев, не так ли?

ответ

4

Лично я думаю хорошая практика для этого. Существует небольшая опасность зайти слишком далеко и создать массу кода, чтобы выполнить свой тест, и в этом случае вам следует пересмотреть дизайн тестируемого вами материала. Вы действительно не хотите писать тесты для тестирования своих тестов, но пример, который вы даете, кажется прекрасным, и это означает, что ваши тестовые примеры намного проще.

Я не использовал PMD, и лично я попытался бы настроить его для включения этих предупреждений. Если они вас волнуют, вы можете изменить свой код, чтобы избавиться от них. Я предполагаю, что второе предупреждение было вызвано тем, что ваш вспомогательный метод начинается с теста слова. В junit3 все методы, которые начинаются с теста, - это тесты. Почему бы не переименовать метод testDivisorsAux как assertDivisors - возможно, метод, который начинается с assert, также поможет с первым предупреждением.

+0

Большое спасибо за ваш ответ @Adam. Меня не беспокоили предупреждения PMD, но в любом случае хороший трюк, чтобы их избежать! :) Не только хороший трюк, я думаю, что имена, которые вы предлагаете, также более наглядны, чем мои ... – AJPerez

0

Как предложил Адам Батлер, метод, начинающийся с assert, разрешит это предупреждение.

Итак, в вашем случае переименуйте testDivisorsAux в assertDivisorsAux, исправив его.

См. Также http://pmd.sourceforge.net/pmd-4.3.0/xref/net/sourceforge/pmd/rules/junit/JUnitTestsShouldContainAsserts.html для кода, который проверяет правило.

Смежные вопросы