2012-07-03 124 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執行行,這樣你就可以很容易地找到哪個進程終止。