0

Для тестирования модулей, которые используют GemFire, мы планируем включить GemFire ​​'Regions' в тестовый контекст, чтобы избежать насмешек и иметь какую-либо зависимость от сервера Gemfire. Каковы наилучшие методы/инструменты, доступные для этого?Тестирование модулей с помощью GemFire ​​- лучшие практики

Theoritically, ниже вариант мы планируем:

Сервис -> GemFire ​​(встроенный в тест-контекст)

Для начальной загрузки контекста, ContextConfiguration: добавить тест-ApplicationContext, который имеет ссылку gfe-cache xml.

Junits загрузит тестовый контекст и загрузит регионы, теперь мы можем запустить создание/выборку/удаление с помощью GemFire ​​и проверить результаты.

ответ

1

То, что вы описываете, являются интеграционные тесты и что-то Spring Data GemFire ​​ делает почти точно так, как вы описали, хотя и немного более непосредственно (т.е. инъекционные GemFire ​​регионов или, возможно, другие компоненты GemFire ​​непосредственно в тестовые классы). Например, посмотрите на класс GemFireTemplateIntegrationTest вместе с его ассоциированным Spring (XML) config.

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

Другими словами, и, как вы уже упоминалось выше, имеющий следующий (традиционный п) ярусы в приложении ...

UI -> Сервис -> DAO

Служба уровня чистый бизнес логики и правил и любых взаимодействий (CRUD, Querying, Function execution и т. д.) с любым хранилищем данных (GemFire ​​/ Geode включено) осуществляется через DAO.

Это делает насмехаться над DAO очень просто, чтобы вы могли сосредоточиться на точке тестов Service, протестировать бизнес-логику и правила независимо от того, как ведет себя основной хранилище данных.

Конечно, важно иметь интеграционные тесты для обеспечения правильного взаимодействия с вашим базовым хранилищем данных, например GemFire ​​/ Geode, если только для обеспечения надлежащего транзакционного поведения или того, что ваши операторы OQL (запроса) хорошо сформированы ,

Но есть много вариантов, когда речь заходит о реализации вашего DAO.

  1. Вы можете ввести Регион в свои DAO (ы) и выполнить операции (CRUD, Queries и т. Д.) Непосредственно в Регионе.

  2. Если вы используете Spring Data GemFire ​​, вы можете предпочесть, чтобы защитить ваши DAO (ы) от прямого использования GemFire ​​/ Geode API с использованием GemfireTemplate (в случае интерфейса нарушения изменений, внесенных GemFire ​​/ Geode, или для обертывания исключений GemFire ​​/ Geode в Весна удобна и согласована (через хранилища данных) Exception class hierarchy, что полезно, если вы когда-либо заменяете хранилища данных). См. here для получения более подробной информации.

  3. Наконец (но не в последнюю очередь), вы можете использовать Spring Data GemFire-хextensionиз Repository абстракции Spring общие данные с поддержкой GemFire ​​/ Geode. Это делает реализацию DAO (репозитариев a.k.a.) простой в определении интерфейса, который расширяет GemfireRepository.

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

Как один последний лакомый кусочек, это не мешает вам продолжать писать настоящие тесты единиц.

Спринг данных GemFire ​​ использует custom test framework (с издевается и заглушек) для упрощения модульных тестов с участием компонентов GemFire ​​(такие как регионы, AEQs, шлюзы и т.д.). Этот «пользовательский тестовый каркас» внедрен в GemfireTestApplicationContextInitializer и связан с ним GemfireTestBeanPostProcessor. Если вы будете следовать логике, вы начнете видеть, как она работает.

Эта настраиваемая тестовая структура очень полезна для проверки правильности создания и инициализации компонентов GemFire ​​с использованием SDG's XML namespace. Тем не менее, становится все более популярным размещать метаданные конфигурации, даже для компонентов GemFire ​​/ Geode, в Spring config now, что-то, что я искал enhance/simplify далее в Spring Data GemFire ​​ 1.9.

Кроме того, я надеюсь, в какой-то момент, работе, что я уже начал, чтобы возвысить и реорганизовать структуру теста пользовательских Spring Data GemFire ​​в отдельное, верхнем уровне расширения Spring проекта для Spring Data GemFire ​​ так как этот вопрос был задан очень часто.

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

Cheers!

+0

Спасибо за четкий и подробный ответ John! Я согласен в принципе в отношении UnitTests, но всегда есть несколько частей, которые имеют некоторые общие данные на основе, которые легче иметь в источнике данных, а не издеваться над каждым объектом. Мы используем вариант № 3 для DAO, полагаясь на абстракцию пружинных данных. Каковы возможности тестирования интеграции без подключения к серверу common-gemfire? Я просто хочу использовать столько же, сколько существующие определения кэша, с помощью всего лишь нескольких конфигураций, которые заставят серверные кэши вести себя как области кэша в памяти и можно тестировать. –

+0

На самом деле, это всего лишь вопрос об избежании затрат на запуск экземпляра (встроенного) GemFire, но вы можете свести к минимуму эту стоимость, установив перед собой несколько свойств GemFire ​​System, таких как предупреждение уровня журнала (минимально) 'и mcast-port до' 0 '. Я сделал это во многих тестах интеграции SDG (например, https://github.com/jxblum/spring-data-gemfire/blob/master/src/test/resources/org/springframework/data/gemfire/GemfireTemplateIntegrationTest-context. xml # L13-L17) ... –

+0

Установив mcast-порт в частности (без указателей), вы создаете автономный узел, который минимизирует накладные расходы на распространение (резервирование портов, создание сокетов, поиск других членов и т. д.), которые не требуется, если вы не тестируете многоузловой кластер в своем тестовом наборе. Как правило, для большинства тестовых случаев достаточно одного узла. Настройка многоузлового кластера является как дорогостоящей, так и сложной задачей, что команда GemFire ​​создала отдельную структуру для (называемой Hydra). Это не тривиально. –