我正在运行一些将文档保存到MongoDb数据库的单元测试。要使此单元测试成功,必须启动MongoDb服务器。我通过使用Process.Start(“mongod.exe”)执行此操作。
它有效,但有时需要时间才能启动,甚至在它开始之前单元测试试图运行和失败。单元测试失败并抱怨mongodb服务器没有运行。
在这种情况下该怎么办?
答案 0 :(得分:4)
如果您在测试中使用外部资源(数据库,Web服务器,FTP,备份设备,服务器群集),那么它将进行集成测试然后进行单元测试。在测试中启动所有外部资源是不方便和不实际的。只需确保您的测试将在可预测的环境中运行。有几种方法可以做到:
不要在测试中添加任何延迟,以便在外部资源启动时等待 - 这会使测试变得缓慢,不稳定且非常复杂。
答案 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,要编写集成或验收测试,您应该使用内存中的瞬态数据库,其中只包含您的测试数据,正如其他人所提到的那样。