我想知道是否有人知道对一个宁静的网络服务进行单元测试的正确方法。我有一组使用凹槽构建的web服务,我想为它们编写测试代码。不幸的是,由于我的webservices绑定到数据库,我的测试最终会填充数据库,这似乎是一个问题。
我主要询问从单元测试角度处理这个问题的正确方法。我是否在测试后清除了我插入的值的数据库?我是否有一套带有一整套特殊测试路线的特殊测试数据库?对于解决这个问题的最佳方法,我感到有点失落。
显然,在类似数据库包装类的其他情况下,您只需传入在测试开始时设置的虚拟数据库。这似乎更具挑战性,尽管它涉及到像休息这样的宁静框架。
我很感激您以正确的方式处理将信息保存到数据库的正确方法。
提前致谢。
答案 0 :(得分:3)
通常在测试Web服务时,您从外部测试完整堆栈。这意味着您请求资源并检查结果是否符合您的期望。
几乎在所有情况下,在每个请求之前填充数据库都是一个好方法。这似乎有点矫枉过正,但实际上,通过模拟/存储各种元素,您无法保证正确的测试覆盖率。
来自Ruby世界,Cucumber是理想的方法,因为它允许您从高级别进行测试。当你将它与Rspec结合起来进行实际的单元测试(直接查询对象的低级测试)时,你将获得两全其美的效果。这些库甚至带有一个名为“数据库清理器”的东西,它将为您管理填充和减少数据库的填充。
你可能会发现Rspec的作者的以下博客文章非常有用,因为它解释了为什么你应该避免过多的嘲弄和存根。 http://blog.davidchelimsky.net/2011/09/22/avoid-stubbing-methods-invoked-by-a-framework/
答案 1 :(得分:2)
一般来说,您有两种选择:
1)使用具有已知数据的专用测试数据库,您可以在其上设置您的期望 - 在开始测试之前用“原始数据库”替换数据库。这将被视为集成测试,因为您实际上依赖于数据库。
2.。)使您的代码独立于实际数据存储,并将依赖项传递给持久层。对于单元测试,您可以编写(或模拟)自定义持久层/对象,以便您观察单元测试的状态更改。
两者的健康组合取决于场景通常提供良好的覆盖率。
另外,不要测试您的Restful Web服务,而是考虑只委托每个服务端点中的POCO,然后直接测试这些POCO - 更容易测试,您还剩下要做的就是验证服务端点和POCO之间的映射。 / p>
答案 2 :(得分: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)
当然,其他人同时使用数据库可能会在测试期间看到瞬态值。