Встроенный MongoDB при выполнении интеграционных тестов

Мой вопрос – это вариация этого .

Поскольку для моего проекта Java Web-app требуется много фильтров / запросов и интерфейсов чтения с такими инструментами, как GridFS, я изо всех сил пытаюсь придумать разумный способ использования MongoDB в том, как это предлагает предлагаемое решение.

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

Может ли кто-нибудь, кто больше знает о MongoDB, помочь мне понять идею осуществимости этого подхода и / или, возможно, предложить любые материалы для чтения, которые могут помочь мне начать работу?

Я также открыт для других предложений, которые могут возникнуть у людей о том, как я мог бы подойти к этой проблеме …

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

В настоящее время поддерживает версии MongoDB: от 1.6.5 до 3.1.6 , при условии, что двоичные файлы все еще доступны из настроенного зеркала.

Вот краткий пример использования, который я только что попробовал, и он отлично работает:

 public class EmbeddedMongoTest { private static final String DATABASE_NAME = "embedded"; private MongodExecutable mongodExe; private MongodProcess mongod; private Mongo mongo; @Before public void beforeEach() throws Exception { MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance(); mongodExe = runtime.prepare(new MongodConfig(Version.V2_3_0, 12345, Network.localhostIsIPv6())); mongod = mongodExe.start(); mongo = new Mongo("localhost", 12345); } @After public void afterEach() throws Exception { if (this.mongod != null) { this.mongod.stop(); this.mongodExe.stop(); } } @Test public void shouldCreateNewObjectInEmbeddedMongoDb() { // given DB db = mongo.getDB(DATABASE_NAME); DBCollection col = db.createCollection("testCollection", new BasicDBObject()); // when col.save(new BasicDBObject("testDoc", new Date())); // then assertThat(col.getCount(), Matchers.is(1L)); } } 

Существует продукт Foursquare Fongo . Fongo – это встроенная в Java реализация mongo. Он перехватывает вызовы стандартного mongo-java-драйвера для находок, обновлений, вставок, удалений и других методов. Основное использование – для легкого модульного тестирования, где вы не хотите разворачивать процесс монго.

Если вы используете sbt и specs2, я написал такую ​​же оболочку для embedmongo

https://github.com/athieriot/specs2-embedmongo

Если вы используете Maven, вам может быть интересен плагин, который я создал, который завершает API-интерфейс flapdoodle.de ’embedded mongo’ :

embedmongo-Maven-плагин

Он обеспечивает start цель, которую вы можете использовать, чтобы запустить любую версию MongoDB, которую вы хотите (например, во время pre-integration-test ), и цель stop , которая остановит MongoDB (например, во время post-integration-test ).

Настоящая выгода от использования этого плагина над другими заключается в том, что MongoDB не требуется устанавливать заранее. Бинарные файлы MongoDB загружаются и сохраняются в ~/.embedmongo для будущих сборок.

с spring-boot 1.3 вы можете использовать EmbeddedMongoAutoConfiguration

pom.xml

  org.springframework.boot spring-boot-starter-parent 1.3.2.RELEASE  ...  org.springframework.boot spring-boot-starter-data-mongodb   de.flapdoodle.embed de.flapdoodle.embed.mongo ${embedded-mongo.version}  

MongoConfig

 @Configuration @EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class }) public class MongoConfig{ } 

Вы можете запустить MongoDB в памяти с версии 3.2.6. С сайта :

Начиная с версии MongoDB Enterprise 3.2.6, механизм хранения в памяти является частью общей доступности (GA) в 64-битных assemblyх. Помимо некоторых метаданных и диагностических данных, механизм хранения в памяти не поддерживает данные на диске, включая данные конфигурации, индексы, учетные данные пользователя и т. Д.

Если вы используете maven, вы можете использовать наш http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin

Вы также можете проверить этот проект, который имитирует MongoDB внутри JVM-памяти. https://github.com/thiloplanz/jmockmongo Но он все еще находится в разработке.

Не [только для] для модульных тестов, но прочитайте это сообщение в блоге, если вы хотите запустить MongoDB (даже кластер) в качестве развертывания в памяти, если вы используете Linux.

http://edgystuff.tumblr.com/post/49304254688

Было бы здорово, если бы он был из коробки, как RavenDB.

Подобно встроенному плагину embedmongo-maven, имеется также плагин Gradle Mongo .

Как и плагин Maven, он также обертывает flapdoodle EmbeddedMongoDb api и позволяет запускать управляемый экземпляр Mongo из ваших сборок Gradle.

В производстве вы будете использовать реальную базу данных.

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

Поддельная реализация может не соответствовать точно такой же, как реальная. При тестировании вы должны стремиться к правильности. Скорость исполнения – вторая.

Проверьте этот пример кода здесь: https://github.com/familysyan/embedded-mongo-integ . Нет установки, никакой зависимости. Это просто скрипт, независимый от платформы, который загружает и настраивает для вас. Он также очищает все после ваших тестов.

Давайте будем гением компьютера.