Модульное тестирование и запуск сервера MongoDb - PullRequest
4 голосов
/ 29 мая 2010

Я запускаю какой-то модульный тест, который сохраняет документы в базе данных MongoDb. Для успешного выполнения этого модульного теста необходимо запустить сервер MongoDb. Я выполняю это с помощью Process.Start ("mongod.exe").

Это работает, но иногда требуется время для запуска, и даже прежде, чем он даже запустится, тестовый модуль пытается запустить и НЕ ВЫХОДИТ. Модульное тестирование не проходит и жалуется, что сервер mongodb не работает.

Что делать в такой ситуации?

Ответы [ 5 ]

4 голосов
/ 03 июня 2010

Если вы используете внешний ресурс (БД, веб-сервер, FTP, устройство резервного копирования, кластер серверов) в тесте, то это скорее интеграционный тест, чем модульный тест. Не удобно и не практично запускать все внешние ресурсы в тесте. Просто убедитесь, что ваш тест будет работать в предсказуемой среде. Есть несколько способов сделать это:

  1. Запуск набора тестов из скрипта (BAT, nant, WSC), который запускает MongoDB перед запуском теста.
  2. Запустите MongoDB на сервере и никогда не закрывайтесь вниз.

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

2 голосов
/ 10 июля 2010

На самом деле это проще:) ... просто запустите mongodb как сервис:
Как запустить MongoDB в качестве службы Windows?

Это очень просто, за исключением того, что на некоторых ОС у вас есть скрипты с некоторыми настройками реестра, чтобы запустить службу, вы можете найти и найти статью об этой игре. Дайте мне знать, если вам нужна помощь.

1 голос
/ 04 июня 2010

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

Перед запуском теста он проверяет, работает ли экземпляр test mongod, и, если нет, загружает его на ваш любимый порт test-mongo. Я считаю, что на самом деле не так уж и дорого просто попытаться загрузить новый экземпляр mongod и позволить ему выйти из строя, так как этот порт уже используется. Однако в Windows это сильно отличается, поэтому вы можете проверить, открыт ли порт или что-то в этом роде.

Перед каждым отдельным тестом вы можете удалить все элементы из всех протестированных коллекций, если это именно то, что вам нужно. На самом деле, я просто отбрасываю все базы данных, так как прекрасный mongodb воссоздает их для вас:

for (String name : mongo.getDatabaseNames()) {  
  mongo.dropDatabase(name);
}

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

1 голос
/ 29 мая 2010

Не можете ли вы выполнить быстрый тестовый запрос в цикле с задержкой после запуска и проверить, работает ли БД перед продолжением?

0 голосов
/ 15 июня 2011

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

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

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