• Модульные тесты интеграционные тесты против с весны

    Я работаю над проекта Spring MVC и у меня есть юнит-тестов для всех различных компонентов в исходном дереве.

    Например, если у меня есть контроллер HomeController, который должен иметь LoginService вводят в нее, то в моем Unit-тест HomeControllerTest Я просто инстанцировать объекта в обычном режиме (вне весны) и впрыскивают в собственность:

    protected void setUp() throws Exception {     super.setUp();     //...     controller = new HomeController();     controller.setLoginService( new SimpleLoginService() );     //... } 

    Это прекрасно работает для тестирования каждого компонента как изолированной единицы, но теперь, что у меня есть несколько десятков классов в проекте, после написания класса и написания успешного блока проверить на это, все забываю обновить свой Весенний MVC в контексте файла, что делает фактические проводки в развернутом приложении. Я узнаю, что я забыл обновить файл контекста, когда я развернуть проект на Tomcat и найти кучу NullPointers от курение в боевой готовности фасоли.

    Итак, вот мои вопросы:

    1. Это мой первый Весенний проект - это нормально для создания модульных тестов для отдельных бобы, как делал я, а затем создать второй набор тестов (интеграционные тесты) для проверки, что все работает, как ожидалось с фактическим контекста приложения? Существует ли утвержденная наилучшей практики для этого?

    2. Кроме того, как вы отделите блок тестов из интеграционных тестов? У меня есть весь исходный код в src блок тестов в test - там должно быть 2-й папке Test (например, test-integration) для тестов интеграции?

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

  • Ответы

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

    Модульные тесты:

    • Создать модульные тесты для нетривиальных бобы (т. е. большая часть твоей весне, связанных с фасоль)
    • Используйте издевается для встраиваемых сервисов, где практические (т. е., большинство, если не все время).
    • Используйте стандартную схему именования для этих тестов в проекте test каталог. Используя Test или TestCase в качестве префикса или суффикса к имени класса, кажется, широко практикуется.

    Интеграционные Тесты:

    • Создать AbstractIntegrationTestCase что устанавливает Spring WebApplicationContext для использования в intetgration тест clases.
    • Использовать соглашение об именовании для интеграционных тестов в test каталог. Я использовал IntTest или IntegrationTest в качестве префикса или суффикса, за эти испытания.

    Созданы три муравья test цели:

    1. тест-все (или что вы хотите назвать его): выполнение модульных и интеграционных тестов
    2. тест: выполните модульные тесты (просто потому, что test как представляется, наиболее общее использование для модульного тестирования
    3. тест-интеграция: запустить тесты интеграции.

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

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

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

    Несколько отдельных пунктов:

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

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

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

    Основные интеграционные тесты, чтобы поднять свой Весенний контекстах полезны.

    В @требуется Аннотация может помочь Вам убедиться, что вы поймать необходимое зависимости в весенней проводки.

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

    Много нудных дважды бухгалтерского учета с весной уходит, если Вы также переключиться на чисто аннотированный режим, где вы комментировать все ваши бобы с @компонент, контроллер@, @обслуживание и @repository. Просто добавить @Подгружен к атрибутам вы должны получить инъекции.

    См. Раздел 3.11 весны справочное руководство. http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

    На соответствующую записку, мы были через блок деления/тесты Integratrion, что Кенг описать. В моем последнем режиме мы также ввели третий "класс" тесты, "ComponentTests". Эти бегают с полными весна проводку, но с проводным реализации заглушку (через компонент-сканирование фильтров и аннотации весной).

    Причина мы сделали это потому, что для некоторых "пласт сервис", Вы в конечном итоге с ужасным объем ручного кодирования проводки логику, чтобы вручную подключить Боба, и иногда смешные суммы макеты объектов. 100 линий электропроводки по 5 строчек тест-это не редкость. Компонент тесты решить эту проблему.

    Использовать интерфейс InitializingBean (реализует метод "afterPropertiesSet") или указать инит-метод для вашей фасоли. InitializingBean как правило, легче, потому что Вы не должны помнить, чтобы добавить метод init, чтобы ваши бобы.

    Использовать afterPropertiesSet чтобы убедиться, что все вводится как не-NULL, если это значение NULL, исключение.

    Когда я создал интеграционных тестов для веб-приложений, я положила их в отдельный каталог. Они построены с помощью junit или testng и взаимодействовать с тестируемой системой, используя что-то вроде Селена , что попадает на веб-страницы, как если бы они были пользователями. Цикл будет выглядеть так: скомпилировать, запустить юнит-тесты, построить веб-приложение, развернуть его к работающему серверу, выполнить тесты, удалять приложения, и результаты отчета. Идея в том, чтобы проверить всю систему.

    Что касается выполнения модульных тестов отдельно от интеграционных тестов, я поставил все последнее в интеграции-тест каталог и запустить их используя IDE/Ант с использованием подхода, как это. У меня работает.

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