单元测试RESTful Web服务

3

我想知道有没有人知道如何正确地对restful webservice进行单元测试。我构建了一组使用recess的webservice,希望为它们编写测试代码。不幸的是,由于我的webservice与数据库相关联,我的测试最终会导致数据库被填充,这似乎是个问题。

我主要是想从单元测试的角度来处理这个问题。我应该在测试后清除插入的值吗?还是我需要一个特殊的测试数据库和一整套特殊的测试路线?我对最佳方法感到有些困惑。

显然,在其他类似的数据库封装类的情况下,您只需传递一个在测试开始时设置的虚拟数据库即可。但是,当涉及到像recess这样的restful框架时,这似乎更具挑战性。

非常感谢您提前提供任何关于处理测试保存信息到数据库的正确方法的想法。

3个回答

3
通常在测试 Web 服务时,您正在从外部向内部测试整个堆栈。这意味着您请求资源并检查结果是否符合您的期望。
几乎在所有情况下,在每个请求之前填充数据库都是一个很好的方法。这可能看起来有点过度,但实际上,对于 Web 服务,您无法通过模拟/存根各种元素来保证正确的测试覆盖率。
来自 Ruby 世界的 Cucumber 是理想的方法,因为它让您从高层次进行测试。当您将其与 Rspec 结合使用以进行实际的单元测试(直接查询对象的较低级别测试)时,您就可以得到最佳效果。这些库甚至带有称为“database cleaner”的东西,它将为您管理填充和清除数据库。
你可能会发现 Rspec 的作者写的这篇博客非常有帮助,因为它很好地解释了为什么应该避免过多的模拟和存根。http://blog.davidchelimsky.net/2011/09/22/avoid-stubbing-methods-invoked-by-a-framework/

2

一般来说你有两个选择:

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

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

通常根据情况健康混合使用两者提供良好的覆盖率。

此外,不要测试您的Restful Web服务,而是考虑仅在每个服务端点中委派给POCO,然后直接测试这些POCO - 更容易测试,而且您只需要验证服务端点和POCO之间的映射即可。


我想我的问题归结为像recess这样的框架,是否有一种好的方法“传递依赖到持久化层”?看起来很难只是切换路由指向的数据库? - akhalsa

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)  

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接