2011-09-28 58 views
3

我想知道是否有人知道正确的方式来单元测试一个宁静的web服务。我有一套使用隐藏的Web服务,我想为它们编写测试代码。不幸的是,由于我的web服务与数据库绑定,我的测试最终会填充数据库,这似乎是一个问题。单元测试宁静的webservices

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

很显然,在其他类似的数据库包装类的情况下,您只需传入您在测试开始时设置的虚拟数据库。这看起来似乎更具挑战性,尽管当涉及到像休息一样的休息框架时。

我很感激你们所有人都可能用正确的方式来处理将信息保存到数据库的测试。

在此先感谢。

回答

2

一般来说,你有两个选择:

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

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

两者的健康组合通常会提供良好的覆盖范围。

也可以不考虑测试您的Restful Web服务,而是考虑将其委托给每个服务端点中的POCO,然后直接测试这些POCO - 更容易测试,并且您只需验证服务端点和POCO之间的映射。

+0

我想我的问题归结为像休会一样的框架,有没有一种很好的方式来“传递依赖到持久层”?它似乎很难只是指出路由指向哪个数据库? – akhalsa

3

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

在几乎所有情况下,在每次请求之前填充数据库都是一种好方法。这可能看起来像是过度杀毒,但实际上,通过Web服务,您无法通过嘲弄/扼杀各种元素来保证适当的测试覆盖率。

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

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

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) 

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