Во всех ли случаях в Spring Boot необходимы как интеграционный, так и модульный тест?

У меня есть бэкэнд Spring Boot, где я запускаю интеграционные тесты для своих контроллеров (конечные точки) и модульные тесты для своих методов обслуживания. Для некоторых конечных точек существуют только простые вызовы служб, которые возвращаются так же, как служба возвращает данные.

Лучше всего создать только интеграционный тест для проверки конечной точки, создать только модульный тест для проверки метода службы или мне следует добавить оба?

Вы также можете создать тест для проверки интеграции между Spring Framework (обработка HTTP), вашим контроллером и уровнем обслуживания. Тестирование — очень спорная тема, на которую нет однозначного ответа. Действительно сложно сказать, что тестировать, а что заглушить и что на самом деле представляет собой модуль? Класс или только части класса или даже несколько классов с одинаковой ответственностью? Для начала могу порекомендовать эту статью: martinfowler.com/articles/practical-test-pyramid.html

Moritz Kampfinger 03.04.2024 09:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
198
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мой ответ: если вы не уверены в определенной части кода, напишите как можно больше тестов. Интеграционное тестирование предназначено не только для тестирования конечных точек, а модульное тестирование — не только для тестирования сервисов.

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

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

Ответ принят как подходящий

Чего вы хотите достичь:

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

Давайте сначала проанализируем, что у вас есть:

  • Класс контроллера с логикой представления (уровень представления).
  • Класс обслуживания с бизнес-логикой (уровень приложения)
  • Контекст приложения Spring (сторонняя платформа)

Обеспокоенность:

  • Если вы тестируете только поведение вашего контроллера или вашего сервиса (юнит-тест), кто вам гарантирует, что оба компонента взаимодействуют друг с другом так, как запланировано?
  • Если вы рассматриваете контроллер и сервис как одно целое и тестируете их вместе (Модульный тест... подождите... разве это уже не интеграционный тест, поскольку вы интегрируете разные уровни вашего приложения. Это уже самоуверенность.) , то ваша тестовая установка может оказаться довольно сложной, если вы хотите протестировать все сценарии различий.
  • Должен ли я загружать контекст приложения Springs для проверки поведения моего API (это можно назвать интеграционным тестом, поскольку клиент интегрируется с нашей тестируемой системой)?
  • Если я тестирую, что мне следует тестировать и что мне следует отключить (например, с помощью Mockito)
  • и т. д.

Отвечать:

Как видите, проблем много, а четкого ответа на ваш вопрос нет. Если бы мне пришлось дать четкий ответ на ваш вопрос, я бы сделал следующее:

  • Загрузите контекст приложения и протестируйте конечную точку API с помощью макета MVC, а, следовательно, и поведение вашего контроллера.
  • Протестируйте поведение интерфейса вашего сервиса, не загружая контекст приложения (он здесь не нужен, поскольку ваша бизнес-логика должна работать без Spring Framework).

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

Другие вопросы по теме