Должен ли я разделить методы для повторного использования в JUnit? - PullRequest
6 голосов
/ 06 сентября 2010

У меня есть следующий тест 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 раза дольше, чем тестируемый метод:)

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

Ответы [ 2 ]

5 голосов
/ 07 сентября 2010

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

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

0 голосов
/ 09 октября 2014

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

Так что в вашем случае переименуйте testDivisorsAux в assertDivisorsAux, чтобы исправить это.

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

...