【问题标题】:Unit Testing And Starting MongoDb Server单元测试和启动 MongoDb 服务器
【发布时间】:2011-02-25 08:48:12
【问题描述】:

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

它可以工作,但有时需要一些时间才能启动,甚至在它开始之前,单元测试就会尝试运行并失败。单元测试失败并抱怨mongodb服务器没有运行。

遇到这种情况怎么办?

【问题讨论】:

    标签: windows unit-testing mongodb


    【解决方案1】:

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

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

    【讨论】:

    • 我想说的是“单元测试纯粹主义者”而不是 TDD。我发现 TDD 的角度更实用,如果您需要确保您的代码适用于 MongoDB,那么您需要针对 MongoDB 测试您的查询
    【解决方案2】:

    我想我会(我的意思是,这就是我所做的,但很有可能有人有更好的主意)编写某种 MongoTestHelper,它可以在不同阶段做很多事情你的测试。

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

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

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

    测试运行后,如果您选择在随机端口上启动,您总是可以将其关闭,但这似乎有点愚蠢。生命太短暂了。

    【讨论】:

    • 是的,我已经在做所有这些了!无论如何,删除数据库或集合时要小心的一件事是,在集合上创建的每个索引都会丢失。我通常会遍历所有集合并删除单个记录,而不是删除集合或数据库。
    【解决方案3】:

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

    1. 从脚本运行测试套件(BAT, nant, WSC),它启动 MongoDB 在运行测试之前。
    2. 在服务器上启动 MongoDB 并且永不关闭 下来。

    不要在测试中添加任何延迟循环以等待外部资源启动 - 这会使测试变得缓慢、不稳定且非常复杂。

    【讨论】:

      【解决方案4】:

      您不能在启动后延迟循环运行快速测试查询并在继续之前验证数据库已启动吗?

      【讨论】:

      • 您的意思是在运行每个单元测试之前运行测试查询?
      • 不,在您重新启动数据库之后,以便您知道它在单元测试开始之前正在运行。我的意思是将它包含在启动数据库的同一例程中。
      • 不明白你说的启动数据库是什么意思!我没有任何数据库。这是一个需要启动服务器的 MongoDb 数据库。我可以在启动服务器后延迟,但它看起来很奇怪!
      • 如果您使用脚本启动数据库,您可能会有一个小循环,它会执行查询并在查询失败后延迟重试。然后您知道数据库已准备好进行测试,您可以最大限度地减少死区时间。
      猜你喜欢
      • 2013-05-04
      • 2014-12-05
      • 2018-03-18
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多