Как выполнить модульное тестирование функций, чтобы их вход вообще не изменял поведение функций? - PullRequest
0 голосов
/ 29 января 2019

У меня иногда возникают проблемы, когда я думаю о модульном тестировании.Давайте посмотрим на этот сценарий:

@POST
    @Path("/search")
    public Response searchSelections(SearchRequestDto searchRequestDto,
        @BeanParam ScrollableDto scrollableDto) {
        Scrollable scrollable = Scrollable.getScrollable(scrollableDto);
        Page<SelectionDto> selectionDtos =
            selectionService.search(searchRequestDto, scrollable);
        return Response.ok(selectionDtos).build();
    }

Итак, в этом модульном тесте контроллера (не говоря об интеграции) я ожидаю, что с точки зрения бизнеса:

  1. Если searchRequestDto имеет значение null, нетфильтр применен, я ожидаю, что все сущности.
  2. Если scrollableDto имеет значение null, нумерация страниц не применяется, я ожидаю, что все сущности.
  3. Если ничего не найдено, является ли searchRequest, scrollable нулевым или нет, еслив базе данных ничего не найдено, я ожидаю, что объект страницы с пустым списком с HTTP.OK.

Так, как я могу здесь провести модульное тестирование?Все числа, которые я определил выше, находятся под ответственностью других классов.Таким образом, все, что я могу сделать, это высмеивать их без какой-либо проверки в моей функции searchSelections (), которую я тестирую здесь.Например;

Если scrollableDto имеет значение null (номер 2 выше):

  • Первая строка моей функции выше -> Мне все равно, потому что это ответственность Scrollable.Функция getScrollable, которая уже протестирована модулем.
  • Вторая строка моей функции выше -> Ответ прокручивается из приведенного выше.Так что этот прокручиваемый параметр является параметром selectionService.search, и мне это тоже не важно, потому что он уже протестирован модулем.Так что scrollableDto null или not null влияет на мою предыдущую строку, которая просто насмешливая, она не влияет на мое текущее состояние функций.
  • Последняя строка моей функции выше -> Я должен вернуть selectionDtos из предыдущего макета.Теперь мой сценарий модульного тестирования номер 2, который scrollableDto = null, не имеет для меня никакого значения, так как он проверяется, его результат проверяется.

То же самое для других моих сценариев модульного тестирования.Как мне думать, когда мои параметры не изменяют состояние моей функции в тесте, это просто влияет на другое уже проверенное модулем состояние функций, которое я высмеиваю?

(я не хочу проверять вызовы методов, которыене имеет для меня какого-либо ценного вывода, также он всегда увеличивает стоимость нашего тестирования, которая всегда должна обновляться, если функция реорганизована, но ее вывод такой же. Хотя ничего не меняется, нам тоже нужно обновить наши тесты, что требует времени, если вызов функции /параметры проверены, за исключением некоторых случаев, таких как вызов базы данных и т. д.)

Ответы [ 2 ]

0 голосов
/ 29 января 2019

У вас есть два преобразования данных

Scrollable scrollable = Scrollable.getScrollable(scrollableDto);

и

return Response.ok(selectionDtos).build();

И у вас есть одна зависимость:

Page<SelectionDto> selectionDtos = selectionService.search(searchRequestDto, scrollable);
  • Итак, фаза аранжировки должнаОстановите зависимость таким образом, чтобы результат Scrollable.getScrollable(scrollableDto) возвращал страницу выбора.
  • Фаза действия должна вызвать searchSelections с ограничениями в сценарии 2
  • Фаза подтверждения должна утверждатьчто в ответе содержится именно та страница выбора, которую вы указали на этапе аранжировки

Этот тест, вероятно, быстрее, чем интеграционный тест.Тем не менее, если вы планируете тестировать этот метод в любом случае, вы можете пропустить этот тест.

0 голосов
/ 29 января 2019

Так почему же вы настаиваете на юнит-тестировании этого метода?Вам нужны только 1 или 2 высокоуровневых (вы называете их интеграционными) теста, которые проверяют, что все это работает вместе от контроллера до БД.

Тесты накладывают дополнительные расходы на обслуживание, поэтому, если вы можете их опустить (и в этом случае можете) - это здорово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...