2010-05-28 2 views
4

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

Это работает, но иногда требуется время, чтобы начать, и до того, как он даже начнет тестирование единицы, он попытается запустить и НЕ БУДЕТ. Тест модуля не работает и жалуется, что сервер mongodb не запущен.

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

ответ

1

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

+0

Вы хотите запустить тестовый запрос перед запуском каждого отдельного теста? – azamsharp

+0

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

+0

Я не понимаю, что вы подразумеваете при запуске базы данных! У меня нет базы данных. Это база данных MongoDb, для которой требуется запуск сервера. Я могу положить задержку после запуска сервера, но это выглядит странно! – azamsharp

4

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

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

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

1

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

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

Перед каждым отдельным тестом вы можете удалить все предметы из всех проверенных коллекций, если это то, что вам нужно. На самом деле, я просто все бросить ДЕЦИБЕЛЫ, как прекрасный MongoDB будет воссоздать их для вас:

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

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

+0

Да, я уже все это делаю! Во всяком случае, при удалении базы данных или коллекций нужно быть осторожным, так как каждый индекс, созданный в коллекции, будет потерян. Обычно я просматриваю все коллекции и удаляю отдельные записи вместо того, чтобы отбрасывать коллекции или базы данных. – azamsharp

2

Это на самом деле проще:) ... просто запустить MongoDB как сервис:
How to run MongoDB as Windows service?

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

0

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

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

+0

Я бы сказал, что вы имеете в виду «блок-пуристы», а не TDD. Я считаю, что угол TDD более прагматичен, и если вам нужно быть уверенным, что ваш код работает с MongoDB, тогда вам нужно проверить свои запросы на MongoDB – sMoZely

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