【问题标题】:Running node.js tests against test data in a MongoDB database针对 MongoDB 数据库中的测试数据运行 node.js 测试
【发布时间】:2012-07-03 22:24:50
【问题描述】:

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

  1. 启动 MongoDB 进程,作为守护进程分叉
  2. 用一些测试数据预填充数据库
  3. 永远启动我的节点服务器,因此它作为守护进程运行
  4. 运行我的测试
  5. 从数据库中删除测试数据

我有一个粗略的脚本来执行所有这些步骤。我的问题是 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 文档中遗漏了什么?

【问题讨论】:

  • 我对 node 或 mongo 一无所知,但你会用其他语言编写代码,这样它就不会依赖于数据库。
  • 你为什么不多睡一会儿呢?可变时间是什么意思?
  • 有什么理由不能让 mongodb 一直运行?您已经在使用测试数据库,所以我不认为您会有冲突的进程。

标签: bash node.js shell mongodb


【解决方案1】:

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

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

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

【讨论】:

  • 我从来没有完全理解从测试管道中删除数据库的原因。如果我可以针对一个完全模仿我的生产配置和数据模式的隔离的、预先填充的测试数据库进行测试,那难道不是花时间编写和维护 mock 更好吗?
【解决方案2】:

如果您的主要问题是如何找出 mongod 实际启动的时间,为什么不编写一个脚本来告诉您呢?

例如,您可以编写一个直到循环并根据返回值检查客户端是否可以在 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 执行行,以便您可以轻松找到要终止的进程。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2012-05-09
    • 2011-06-29
    • 2019-11-09
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多