3

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

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

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

我将不胜感激你们所有人对处理将信息保存到数据库的测试的正确方法的任何想法。

提前致谢。

4

3 回答 3

3

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

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

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

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

于 2011-09-28T17:50:31.263 回答
2

一般来说,您有两种选择:

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

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

取决于场景的健康组合通常可以提供良好的覆盖范围。

另外,不要测试您的 Restful Web 服务,而是考虑只委托给每个服务端点内的 POCO,然后直接测试这些 POCO——更容易测试,您剩下要做的就是验证服务端点和 POCO 之间的映射。

于 2011-09-28T17:52:52.757 回答
0

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

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

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

于 2016-07-23T03:30:53.713 回答