2013-05-07 4 views
7

У меня есть набор интеграционных тестов, работающих с SpringJUnit4ClassRunner. Я пытаюсь запустить их параллельно, используя maven surefire. Тем не менее, я заметил, что код блокируется перед входом в синхронизированный блок в CacheAwareContextLoaderDelegate.loadContext().Испытания на прохождение пружины параллельно с maven

Есть ли способ обойти этот кеш? Я попытался сделать это, но похоже, что существует более общее состояние, чем только сам кеш, поскольку мое приложение зашло в тупик внутри кода Spring. Или может ли синхронизация быть более мелкозернистой, так или иначе синхронизируя на ключе карты, а не на всей карте?

Моя мотивация для parallelising тестов двояка:

  1. В некоторых тестах я заменить фасоль с издевается. Поскольку издевательства по своей природе являются сдержанными, я должен создать новый ApplicationContext для каждого метода тестирования, используя @DirtiesContext.
  2. В других тестах я хочу развернуть подмножество ресурсов Джерси. Для этого я задаю подмножество классов конфигурации Spring. Поскольку Spring использует MergedContextConfiguration в качестве ключа в кэш-контексте, эти тесты не смогут совместно использовать ApplicationContexts.
+0

Я [поднял отчет об ошибке для этого] (https: //jira.springsource.org/browse/SPR-10536) – hertzsprung

ответ

3

Вполне возможно, что может получить более оборачиваемости времени для тестового костюма если отключить parallell выполнения теста. В испытательной главе справочных материалов Спринга есть пункт о Context caching:

После рамки TestContext загружает ApplicationContext (или WebApplicationContext) для теста, что контекст будет кэшируются и повторно использовать для всех последующих тестов, которые Объявят та же уникальная конфигурация контекста в одном наборе тестов.

Почему это реализовано следующим образом?

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

Как работает кеш?

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

Чтобы воспользоваться механизмом кэширования, все тесты должны выполняться в рамках одного и того же процесса или набора тестов. Это может быть достигнуто путем выполнения всех тестов как группы в среде IDE. Аналогичным образом, при выполнении тестов с помощью фреймворка сборки, такого как Ant, Maven или Gradle, важно убедиться, что структура сборки не развивается между тестами. Например, если forkMode для плагина Maven Surefire установлен всегда или pertest, платформа TestContext не сможет кэшировать контексты приложений между тестовыми классами, и в результате процесс сборки будет работать значительно медленнее.

+0

Спасибо, я не думаю, что прочитал бы этот параграф в документации. Я обновил свой вопрос, чтобы объяснить свою мотивацию для параллелизма. Надеюсь, [ошибка, о которой я сообщал] (https://jira.springsource.org/browse/SPR-10536) скоро будет исправлена. – hertzsprung

+1

@hertzsprung Я предлагаю вам создать отдельный контекст прикладного приложения (или тест [профиль] (http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/) который содержит mocks), которые могут быть кэшированы и повторно использованы другими тестами (это возможно, если вы переустановите() 'состояние обманутого объекта, например, в' @ Before' или '@ After'. Читайте, чтобы найти дополнительную информацию в мой [сообщение в блоге] (http://www.jayway.com/2011/12/12/spring-integration-tests-part-ii-using-mock-objects/)). – matsev

0

Одна простой вещь, что я мог думать, использует @DirtiesContext

+1

Спасибо, я знаю об этом аннотации. Он может очистить контекст между тестовыми классами или методами тестирования, но, насколько я знаю, не избегает глобального блокирования. – hertzsprung

+0

Точно, по-моему, использование @DirtiesContext должно рассматриваться как анти-шаблон. –

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