运行node.js测试MongoDB数据库中的测试数据

时间:2012-07-03 22:24:50

标签: bash node.js shell mongodb

我正在尝试设置一个脚本来执行我的node.js程序的测试,该程序使用MongoDB。我的想法是,我希望有一个我可以运行的脚本:

  1. 启动MongoDB进程,分叉为守护进程
  2. 预先使用一些测试数据填充数据库
  3. 永远启动我的节点服务器,因此它作为守护程序运行
  4. 运行我的测试
  5. 从数据库中删除测试数据
  6. 我有一个执行所有这些步骤的粗略脚本。我的问题是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文档中遗漏了什么?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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添加--pidfilepath到您的mongod执行行的停止,这样您就可以轻松找到要终止的进程。