【问题标题】:unit testing restful webservices单元测试 RESTful Web 服务
【发布时间】:2011-09-28 17:44:01
【问题描述】:

我想知道是否有人知道对宁静的 web 服务进行单元测试的正确方法。我有一组使用凹槽构建的 Web 服务,我想为它们编写测试代码。不幸的是,由于我的网络服务与数据库相关联,我的测试最终会填充数据库,这似乎是个问题。

我主要是从单元测试的角度询问处理此问题的正确方法。我是否在测试后清除我插入的值的数据库?我有一个特殊的测试数据库和一整套特殊的测试路线吗?对于解决此问题的最佳方法,我有点不知所措。

显然,在其他类似数据库包装类的情况下,您只需传入一个在测试开始时设置的虚拟数据库。这似乎更具挑战性,但在使用像休会这样的宁静框架时。

如果您能想到处理将信息保存到数据库的测试的正确方法,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: database web-services unit-testing rest recess


    【解决方案1】:

    通常在测试 Web 服务时,您是从外向内测试整个堆栈。这意味着您请求资源并检查结果是否符合您的期望。

    在几乎所有情况下,在每个请求之前填充数据库都是一种好方法。这可能看起来有点矫枉过正,但实际上,对于 Web 服务,您无法通过模拟/存根各种元素来保证正确的测试覆盖率。

    来自 Ruby 世界,Cucumber 是理想的方法,因为它可以让您从高水平进行测试。当您将它与Rspec 结合起来进行实际的单元测试(直接查询您的对象的较低级别的测试)时,您将获得两全其美的效果。这些库甚至带有一个叫做“数据库清理器”的东西,它会为你管理填充和删除数据库。

    您可能会发现 Rspec 作者的以下博客文章非常有帮助,因为它出色地解释了为什么您应该避免过多的嘲笑和存根。 http://blog.davidchelimsky.net/2011/09/22/avoid-stubbing-methods-invoked-by-a-framework/

    【讨论】:

      【解决方案2】:

      一般来说你有两种选择:

      1) 使用包含已知数据的专用测试数据库,您可以在该数据库上设置您的期望 - 在开始测试之前将数据库替换为“原始数据库”。这将被视为集成测试,因为您实际上依赖于数据库。

      2.) 使您的代码独立于实际的数据存储,并将依赖项传递给持久层。对于单元测试,您可以编写(或模拟)一个自定义持久层/对象,让您观察单元测试的状态变化。

      根据场景将两者结合使用通常可以提供良好的覆盖范围。

      除了测试您的 Restful Web 服务之外,还可以考虑只在每个服务端点内委托给一个 POCO,然后直接测试这些 POCO - 更容易测试,您剩下要做的就是验证服务端点和 POCO 之间的映射。

      【讨论】:

      • 我想我的问题归结为像凹槽这样的框架,有没有一种“将依赖传递给持久层”的好方法?切换路由指向的数据库似乎很难?
      【解决方案3】:

      我的理解是,如果您按此顺序进行测试,您可以测试所有动词,但最后数据库中不会有额外的数据。

      POST ( add a new record)  
      GET  ( fetch the newly added record)  
      PUT/PATCH ( modify the newly added record)  
      DELETE (delete the newly added record)  
      

      当然,同时使用数据库的其他人可能会在测试期间看到瞬态值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2023-03-30
        • 2011-04-30
        • 1970-01-01
        • 2018-11-18
        • 2014-10-21
        • 1970-01-01
        相关资源
        最近更新 更多