2016-06-07 3 views
0

Я нашел много информации о плохих практиках, чтобы использовать несколько утверждений в одном методе (одно условие теста). Ясно. Каждый метод должен проверять одно и только одно условие. Поэтому в большинстве случаев это должно быть утвердительно.В одном утверждении утверждается несколько условий

Но я не могу найти никакой информации о передовом опыте ситуации, если мой один утверждает несколько условий.

Пример:

@Test 
public void findAllPerformers_returnsPerformersInAlphabeticalOrder() { 
    List<String> performers = reportRepository.findAllPerformers(); 
    assertThat("Should return performers in alphabetical order", 
      performers, contains("Bart Simpson", "Homer Simpson", 
        "Ned Flanders", "Xena Warrior Princess")); 
} 

Во-первых, я должен был иметь еще 2 методы испытаний (условия): findAllPerformers_returnsAllUniquePerformers и findAllPerformers_returnsEachPerformerOnlyOnce. Но потом я понял, что мой первый метод также проверяет эти два условия!

Итак, что мне делать?

  1. Оставьте все методы как есть.
  2. Удалите еще 2 метода испытаний и переименуйте мой метод findAllPerformers_returnsPerformersInAlphabeticalOrder в очень длинное название с учетом всех трех условий (потому что он действительно проверяет все три условия!)
  3. Просто удалите еще 2 метода испытаний.
  4. Оставьте все методы, но вызовите метод findAllPerformers_returnsPerformersInAlphabeticalOrder из двух других методов.
  5. Копирование-вставка findAllPerformers_returnsPerformersInAlphabeticalOrder содержание метода до двух других методов.
  6. Что-нибудь еще ...
+0

Я не вижу ничего плохого в модульном тесте, который проверяет более чем одну функциональность, при условии, что вы самостоятельно проверяете каждую функциональность отдельно. –

+0

Итак, вы предлагаете «1. Оставьте все методы как есть».? – djxak

+0

Один утверждать должен проверить одно условие. В противном случае вы не можете определить, из какого отказа. Однако я не понимаю, почему один метод не может проверить несколько условий с несколькими утверждениями, если они связаны. – EJP

ответ

0

Если этот тест не пройден, то человек смотрит на неудачный тест будет первоначально видеть findAllPerformers_returnsPerformersInAlphabeticalOrder(). Если посмотреть на это, кажется, что тестируемый метод вернул список, который не был в алфавитном порядке, а не тот, что в списке не было «Барт Симпсон».

Избегайте вариантов 4 и 5, они действительно не решают ничего и увеличивают дублирование/обслуживание без какой-либо добавленной стоимости (поскольку тесты не будут устранены по причинам, не упомянутым в имени теста). Вместо этого попробуйте найти способ действительно проверить, что вы хотите с помощью assert.

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