单元测试并启动MongoDb服务器

时间:2010-05-28 23:55:44

标签: windows unit-testing mongodb

我正在运行一些将文档保存到MongoDb数据库的单元测试。要使此单元测试成功,必须启动MongoDb服务器。我通过使用Process.Start(“mongod.exe”)执行此操作。

它有效,但有时需要时间才能启动,甚至在它开始之前单元测试试图运行和失败。单元测试失败并抱怨mongodb服务器没有运行。

在这种情况下该怎么办?

5 个答案:

答案 0 :(得分:4)

如果您在测试中使用外部资源(数据库,Web服务器,FTP,备份设备,服务器群集),那么它将进行集成测试然后进行单元测试。在测试中启动所有外部资源是不方便和不实际的。只需确保您的测试将在可预测的环境中运行。有几种方法可以做到:

  1. 从脚本运行测试套件(BAT, nant,WSC),它启动了MongoDB 在运行测试之前。
  2. 在服务器上启动MongoDB,永不关闭 下来。
  3. 不要在测试中添加任何延迟,以便在外部资源启动时等待 - 这会使测试变得缓慢,不稳定且非常复杂。

答案 1 :(得分:2)

实际上更容易:)...只需将mongodb作为服务运行:
How to run MongoDB as Windows service?

这是非常容易的,除了在某些操作系统上你已经摆弄了一些注册表设置以启动服务,你可以搜索并找到有关这个小提琴的文章。如果您需要任何帮助,请告诉我。

答案 2 :(得分:1)

启动后是否可以在循环中运行快速测试查询并确认数据库已启动?

答案 3 :(得分:1)

我想我(并且我的意思是,这就是我所做的,但是每次都有机会有更好的想法)编写某种MongoTestHelper,它可以在不同阶段做很多事情。你的考试。

在测试运行之前,它会检查测试mongod实例是否正在运行,如果没有,则在您最喜欢的test-mongo端口上启动一个。我发现尝试启动一个新的mongod实例并让它失败是因为该端口已经被使用,实际上并不是那么昂贵。但是,这在Windows上非常不同,因此您可能需要检查端口是否打开或是什么。

在每次单独测试之前,您可以删除所有测试集合中的所有项目,如果这是您需要的类型。事实上,我只是丢弃所有的数据库,因为可爱的mongodb会为你重新创建它们:

for (String name : mongo.getDatabaseNames()) {  
  mongo.dropDatabase(name);
}

测试运行后,如果你选择在随机端口上启动,你可以随时关闭它,但这看起来有点傻。生命太短暂了。

答案 4 :(得分:0)

TDD纯粹主义者会说,如果你启动外部资源,那么它不是单元测试。相反,模拟数据库接口,并根据它测试您的类。在实践中,这意味着将代码更改为可模拟,这可能是件好事。

OTOH,要编写集成或验收测试,您应该使用内存中的瞬态数据库,其中只包含您的测试数据,正如其他人所提到的那样。