Массовая загрузка базы данных MongoDB из Java/Groovy для тестирования

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

Поскольку я собираюсь основывать эти начальные тестовые данные на реальных данных из нашей производственной системы, я хотел бы иметь возможность загружать данные из формата JSON/BSON, которые я мог бы получить из запроса в оболочке Mongo или что-то в этом роде. похожий.

По сути, я не хочу писать сотню строк кода, например: new Record(name: 'John Doe', age: '25', FavoriteColor: 'blue').save()

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

Я также не хочу прибегать к порождающим исполнителям, которые запускают mongorestore для загрузки и перезагрузки реальных данных, так как это потребует запуска дополнительного программного обеспечения на машине тестера.

Есть ли способ лучше? Возможно, каким-то образом преобразовать необработанный JSON во что-то, что я смогу затем выполнить с помощью Grails MongoDB GORM или GMongo или прямого вызова драйвера Java MongoDB?


person Michael Oryl    schedule 21.03.2013    source источник


Ответы (2)


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

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

Если вам нужно, чтобы ваши тестовые данные жили в файле (потому что, например, вы хотите сохранить их в своем репозитории кода), вам нужно найти формат, который легко сериализовать в/десериализовать из BSON. JSON кажется очевидным выбором, тем более что, как сказал @drorb выше, у mongodb уже есть инструменты для этого.

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

Я бы предложил хранить каждый объект в отдельном файле JSON, а не иметь большой файл со всеми тестовыми данными. Как бы мне ни нравился JSON, он плохо подходит для потоковой передачи, и вам придется хранить всю коллекцию в памяти, прежде чем вы сможете начать сбрасывать ее в mongodb. Если ваши тестовые данные достаточно велики, это может вызвать проблемы с памятью.

person Nicolas Rinaudo    schedule 21.03.2013

Вы можете использовать com.mongodb.util.JSON. класс для преобразования данных JSON непосредственно в DBObject. Взгляните на этот пример, который демонстрирует как это сделать с помощью драйвера Java.
Эта MongoDB сообщение в блоге показывает, как это сделать с помощью GORM и драйвера Groovy.

person Dror Bereznitsky    schedule 21.03.2013