2016-08-01 5 views
2

Я в настоящее время озадачен правильным способом, я должен сделать шт. тестов. Скажем, мы должны написать JUnit тестов для основного приложения Java Rest CRUD состоит из этих «общих слоев», где каждый слой называет вспомогательный слой:Стратегии тестирования модулей для многоуровневого приложения Java Rest

  • слоем контроллера (например: AccountRestController.getAccount (идентификатор) - возвращает JSON счета)
  • Service слой: (например: AccountServive.getAccount (идентификатор) - возвращает объект Account )
  • Repository слой (например: AccountRepository.getAccount (Id) - возвращает объект Account)
  • Домен лежал эр (например: счета (номер, имя))
  • таблицы базы данных (например: счета (ID, NAME))

Мы также хотели бы иметь следующую гипотезу (или ограничения) для испытаний Unit (не уверен, они подходят, хотя)

  • они должны быть из контейнера (без Tomcat \ Jetty и нет в памяти базы данных? - Я думаю, я бы сделать это в моей интеграции тестов)
  • использования насмешливым (например, Mockito)

Так что мои вопросы:

  • Каков наилучший способ \ правильный путь \ лучших практик, чтобы написать блок тесты для данного типа приложения?
  • быть строгим, мы должны модульного тестирования каждый слой (контроллер, сервис, хранилище, домен) независимо друг от друга насмешливый каждый раз, когда промежуточный слой
  • модульное тестирование Would только верхний контроллер Rest достаточно?
  • ... и еще ... моя гипотеза подходит? (Не могли бы мы сделать Модульное тестирование с контейнером & в базе памяти?)

С уважением

+1

Добро пожаловать в переполнение стека! Вопросы о том, что является «лучшим», «худшим», «лучшей практикой» и т. Д. - не относятся к теме SO, потому что они, как правило, привлекают упрямые ответы и спам. Пожалуйста, обновите свой вопрос, чтобы на нем было меньше мнения. – Ares

ответ

2

И я прыгать прямо в упрямый воды ...

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

Для меня важная часть «модульного тестирования» заключается не в том, чтобы иметь правильные модульные тесты для этих определений, а для того, чтобы иметь автоматическое тестирование, которое может выполняться достаточно быстро (как правило, я держу их под 3s на C++, включая компиляцию, на Android + Java У меня огромные проблемы с производительностью, так как целая инструментальная цепочка IDE + безумно медленная, часто приводящая к таким временам, как 5+ секунд, для более крупных проектов, даже попадающих на 20-30 с построением градиента, и я пытаюсь запустить только действительно базовую единицу тесты, далекие от того, что я делаю на C++, где мои тесты ближе к набору QA).

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

Когда файлы/базы данных участвуют, все происходит обычно медленнее, поэтому я предпочитаю различать, что такое «единичный тест» и что входит в комплект интеграции/QA. Тем не менее, БД в памяти может делать все хорошо для основных вещей.

Я предпочитаю эти тесты ублюдка, потому что, когда я издеваюсь над слоями под/над тестируемым кодом, это заставляет меня волноваться, что я «испекаю» ожидаемый результат в этом тесте слишком много, без ошибок, когда ошибаюсь. Плюс насмешка что-то часто является дополнительной работой, поэтому, когда время выполнения тестов является низкой ценой, я с радостью обращаюсь к «интеграции», как тесты.

В Android/Java от того, что я видел б/у:

  • Мне нравится Mockito много, это как-то подходит, как я думаю о насмешливых красиво.
  • Robolectric (Android специфический) тяжелый вес, поэтому я использую его редко, но иногда он чувствует себя лучше, чем насмешка почти во всем.
  • Кинжал и другие инъекционные инъекции зависимостей: я не могу им понравиться, обычно они сталкиваются с тем, как я пишу модульные тесты, и я не вижу никакой пользы от их использования, я предпочитаю писать инъекции зависимостей в чистом виде Java, это почти такое же количество строк в источнике, и источник - это то, что я ожидаю, когда читаю его через несколько лет.
  • Библиотеки автобусов/событий: это так же сильно меня раздражает, я еще не понял, как тщательно и легко тестировать код, управляемый событиями, мои тесты всегда чувствуют себя слишком много поставленных и полных предположений, плюс это иногда сложно издеваться.

BTW, если возможно, всегда проводит единичный тест при разработке (близко к подходу TDD). Последующие модульные тесты, как правило, гораздо более болезненны, API довольно часто устанавливается (уже используется другими частями/проектами), и когда вы понимаете, что это трудно проверить легко, уже слишком поздно или большой рефакторинг следующий (без тесты, охватывающие исходную версию, поэтому склонность к ошибкам).

Для приложения Java CRUD для Java это звучит так, как будто большинство API могут быть протестированы через все слои без значительного снижения производительности (возможно, DB-mocked/injected/in-memory и другие внешние системы, решаемые аналогичным образом). Но я делаю это на Java только для Android, поэтому у меня нет прямого опыта с таким сценарием.

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