我正在運行一些單元測試,將文檔保存到MongoDb數據庫中。爲了使這個單元測試成功,必須啓動MongoDb服務器。我通過使用Process.Start(「mongod.exe」)執行此操作。單元測試和啓動MongoDb服務器
它的工作原理,但有時需要一段時間才能開始,甚至在它開始之前單元測試試圖運行和失敗。單元測試失敗並且抱怨mongodb服務器沒有運行。
在這種情況下該做什麼?
我正在運行一些單元測試,將文檔保存到MongoDb數據庫中。爲了使這個單元測試成功,必須啓動MongoDb服務器。我通過使用Process.Start(「mongod.exe」)執行此操作。單元測試和啓動MongoDb服務器
它的工作原理,但有時需要一段時間才能開始,甚至在它開始之前單元測試試圖運行和失敗。單元測試失敗並且抱怨mongodb服務器沒有運行。
在這種情況下該做什麼?
不能在啓動後在延遲循環中運行快速測試查詢並在繼續之前驗證數據庫已啓動嗎?
如果您在測試中使用外部資源(DB,Web服務器,FTP,備份設備,服務器集羣),那麼它相當於集成測試然後單元測試。在測試中啓動所有外部資源是不方便和不實際的。只要確保您的測試將在可預測的環境中運行。有幾種方法可以做到這一點:
不要在測試中添加任何帶有延遲的循環,以等待外部資源啓動時 - 它使測試變得緩慢,不穩定和非常複雜。
我想我會(我的意思是,這就是我所做的,但有人有更好的想法的每個機會)寫一些MongoTestHelper,可以在各個階段做許多事情的測試。
在測試運行之前,它會檢查一個測試mongod實例是否正在運行,如果沒有,則在您最喜歡的測試mongo端口上啓動一個。我發現嘗試啓動一個新的mongod實例並讓它失敗,實際上並不昂貴,因爲該端口已被使用。然而,這在windows上非常不同,因此您可能需要檢查端口是否打開。
在每次單獨測試之前,您可以從所有測試集合中刪除所有項目,如果這是您需要的那種。其實,我剛放下所有的數據塊,因爲可愛的MongoDB會重建他們爲你:
for (String name : mongo.getDatabaseNames()) {
mongo.dropDatabase(name);
}
後的試驗運行,你總是可以關閉它,如果您選擇啓動一個隨機端口,但這似乎有點愚蠢。生命太短暫了。
是的,我已經在做所有這些了!無論如何,在刪除數據庫或集合時要小心的是,集合上創建的每個索引都將丟失。我通常會瀏覽所有集合並刪除單個記錄,而不是刪除集合或數據庫。 – azamsharp 2010-06-08 17:25:04
它其實更容易:)...只是執行MongoDB作爲服務:
How to run MongoDB as Windows service?
它除了對你有一些註冊表設置擺弄獲得服務啓動一些操作系統的超級容易,你可以搜索並找到關於這個擺弄的文章。讓我知道你是否需要任何幫助。
TDD純粹主義者會說,如果你啓動外部資源,那麼它不是一個單元測試。相反,嘲笑數據庫接口,並根據它測試你的類。實際上,這意味着將代碼更改爲可嘲弄,這可以說是一件好事。正如其他人所提到的那樣,要編寫集成或驗收測試,您應該只使用內存中的瞬態數據庫,其中只包含測試數據。
我想說你的意思是「單元測試純粹主義者」而不是TDD。 我發現TDD角度更實用,如果您需要確保您的代碼適用於MongoDB,那麼您需要針對MongoDB測試您的查詢 – sMoZely 2011-11-29 19:41:54
您的意思是在運行每個單元測試之前運行測試查詢? – azamsharp 2010-05-29 00:10:16
不,重新啓動數據庫後,您知道它在unittests啓動之前正在運行。我的意思是將它包含在啓動數據庫的相同例程中。 – 2010-05-29 00:28:16
我不明白你的意思是通過啓動數據庫!我沒有任何數據庫。這是一個需要啓動服務器的MongoDb數據庫。啓動服務器後我可以延遲,但看起來很奇怪! – azamsharp 2010-06-01 15:08:54