2012-07-03 7 views
0

Я пытаюсь настроить сценарий для выполнения тестов для моей программы node.js, которая использует MongoDB. Идея заключается в том, что я хочу, чтобы иметь сценарий, который я могу работать, что:Выполнение тестов node.js в тестовых данных в базе данных MongoDB

  1. Запускает процесс MongoDB, раздвоенный как демон
  2. Pre заполнит базу данных с некоторыми тестовыми данными
  3. Запуск моего сервера узла с навсегда , так что он работает как демон
  4. Выполнить мои тесты
  5. Отбросьте тестовые данные из базы данных

У меня есть сырой скрипт, который выполняет все Thes е шаги. Моя проблема в том, что MongoDB занимает определенное количество времени для настройки, что приводит к вызову sleep в моем скрипте. Следовательно, он работает только время от времени.

# the directory of this script 
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

# launch mongodb. 
$DIR/../../db/mongod --fork --logpath ./logs/mongodb.log --logappend --dbpath ./testdb/ --quiet 

# takes a bit of time for the database to get set up, 
# and since we make it a daemon process we cant run the tests immediately 
sleep 1 

# avoid EADDRINUSE errors because existing node servers are up. 
killall node &> /dev/null 

# start up our node server using a test database. 
forever start $DIR/../main.js --dbname=testdb --logpath=test/logs/testlog.log 

# takes a bit of time for node to get set up, 
# and since we make it a daemon process we cant run the tests immediately 
sleep 1 

# run any database setup code (inject data for testing) 
$DIR/../../db/mongo 127.0.0.1:27017/testdb $DIR/setup.js --quiet 

# actually run the tests 
node $DIR/tests.js 

# kill the servers (this could be a little less heavy handed...) 
killall node &> /dev/null 
killall forever &> /dev/null 

# finally tear down the database (drop anything we've added to the test db) 
$DIR/../../db/mongo 127.0.0.1:27017/testdb $DIR/teardown.js --quiet 

# and then shut mogodb down 
kill -2 `ps ax | grep mongod | grep -v grep | awk '{print $1}'` 

Что такое лучший способ пойти о том, что я пытаюсь сделать? Я иду сюда по кроличьей лунке, или я чего-то не замечаю в документах MongoDB?

+0

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

+0

Почему бы вам просто не спать дольше? что означает переменное время? – mindandmedia

+1

Любая причина, по которой вы не можете просто держать mongodb все время? Вы уже работаете с тестовым db, поэтому я не думаю, что у вас будут конфликтующие процессы. –

ответ

0

Задайте себе, какова ваша цель вашего тестирования: проверить ли это фактическое соединение с БД в коде или сосредоточиться на том, правильно ли обрабатывает и обрабатывает данные из базы данных?

Предполагая, что ваш код находится в Javascript, если вы строго хотите проверить правильность обработки вашей логики кода и используете класс объектов-оболочек MongoDB (например, Mongoose), вам может быть интересно добавить в рабочий процесс является создание и запуск специальных тестов с использованием набора тестов Jasmine.

Это связано с написанием тестового кода, mocking-up тестовых данных как объектов javascript. Да, это означает, что любые фактические данные из самой БД не будут участвовать в ваших тестовых тестах. В конце концов, ваша основная цель - проверить, правильно ли работает ваш код? Это ваш проект, только вы знаете ответ :)

+0

Я никогда не понимал причин, почему удаляется БД из тестового трубопровода.Если я могу протестировать изолированную, предварительно заполненную тестовую базу данных, которая точно имитирует мою конфигурацию производства и схемы данных, не так ли предпочтительнее тратить время на запись и поддержание макетов? – plemarquand

0

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

Например, вы можете написать цикл while и проверить, может ли клиент правильно подключаться на сервере mongo на основе возвращаемого значения. Например, вместо того, чтобы использовать sleep 1 использовать что-то вроде этого:

isMongoRunning=-1 

until [[ ${isMongoRunning} -eq 0 ]]; do 
     sleep 1 
     $DIR/../../db/mongo 127.0.0.1:27017/testdb $DIR/empty.js --quiet 
     isMongoRunning=${?} 
done 

Этот цикл закончится только после начала MongoDB.

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

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