2012-07-03 123 views
0

我试图设置一个脚本来执行我的node.js程序的测试,该程序使用MongoDB。这个想法是,我想有一个脚本,我可以运行:对MongoDB数据库中的测试数据运行node.js测试

  1. 启动MongoDB的过程中,分叉的守护
  2. 预填充一些测试数据的数据库
  3. 启动我的节点服务器,直到永远,所以它作为后台进程运行
  4. 运行我的测试
  5. 跌落测试从数据库

我有一个执行所有THES粗脚本数据e步骤。我的问题是,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

我不知道任何关于节点或mongo,但在其他语言,你会写代码,所以它不会依赖于数据库。 – tzerb

+0

你为什么不睡一会儿?可变时间意味着什么? – mindandmedia

+1

任何原因你不能保持mongodb始终运行?你已经在使用一个测试分贝,所以我不认为你会有冲突的进程。 –

回答

0

问问自己,你的测试目的是:测试代码中的实际数据库连接,还是关注代码是否正确处理和处理数据库中的数据?

假设您的代码使用Javascript,如果您严格要测试您的代码逻辑是否正确处理数据,并且正在使用MongoDB包装器对象类(即Mongoose),那么您可能有兴趣将其添加到工作流中是使用Jasmine测试套件进行规范测试的创建和运行。

这将涉及编写测试代码,模拟测试数据作为javascript对象。是的,这意味着来自数据库本身的任何实际数据都不会参与您的规格测试。毕竟,您的主要目的是测试您的代码在逻辑上是否正常工作?这是你的项目,只有你知道答案:)

+0

我从未完全理解从测试流水线中移除数据库的原因。如果我可以对一个完全模仿我的生产配置和数据模式的单独的,预填充的测试数据库进行测试,那么花费时间编写和维护模拟是不是更可取? – plemarquand

0

如果你的主要问题是如何找出什么时候mongod实际开始,为什么你不写一个脚本,会告诉你呢?

例如,您可以编写一个until循环,并根据返回值检查客户端是否可以在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 add --pidfilepath到你的mongod执行行,这样你就可以很容易地找到哪个进程终止。