端到端测试RESTful Web服务(Rails)

时间:2011-06-15 09:00:35

标签: ruby-on-rails web-services testing integration-testing acceptance-testing

我正试图在那里筛选无数的测试解决方案,我甚至不确定我是否朝着正确的方向前进。故事是:我们正在运行一个RESTful Web服务,实现为Rails应用程序,支持我们的移动客户端。我们正在对Web服务进行单元测试(当然),但这涉及模拟应用程序的许多部分,例如搜索堆栈(Apache SOLR)。

此外,我们的测试不会(即不能!)覆盖关键路线,例如移动登录/登录过程,因为这涉及API应用程序和移动网站之间的通信,用户可以在其中输入凭据,例如对于SSO(Janrain Engage)。因此,标准的Rails集成测试不会这样做。

我从理论上认识到,如果测试套件设计得非常好,那么模拟仅严格地发生在下一层测试开始的那些连接点,那么通过单元或功能测试服务API和移动网站另外,可以获得相同的测试覆盖率。我发现在实践中,如果你有几个开发人员独立地在测试套件上工作,这是一种错觉;我承认我们的单元测试并不是那么精心设计的。特别是在运行TDD时,我发现虽然测试可以驱动应用程序代码,但测试代码设计仅针对被测单元进行了定制,从而产生了相当广泛的测试套件。

我发现的另一件事是,有时我们没有纯粹使用单元测试来检测回归,例如由于连锁效应,错误的查询被发送到SOLR服务器。这就是为什么我认为确保整个堆栈沿着关键路由工作的唯一真正方法是在每次部署之前在登台服务器上自动端到端测试,即将实际的HTTP请求发送到应用程序。

我的问题是:

  • 你认为这是一件合理的事吗?我发现很少有关于端到端测试网络上的实时API的信息,让我想知道我是否有任何意义
  • 您会建议哪些工具/设置?我们使用Watir为我们的网站运行验收测试,但对于Web服务来说似乎有些过分(不需要浏览器环境,没有JS或任何UI-ish)。甚至像Ruby脚本一样简单?
  • 您可以给我的任何一般最佳做法或建议w.r.t.设计这样的测试?

2 个答案:

答案 0 :(得分:1)

您可能会对此感兴趣:http://groups.google.com/group/ruby-capybara/browse_thread/thread/5c27bf866eb7fad3

您可能想要尝试的是将Cucumber(或类似)与上面链接中提到的工具之一结合起来,这样您就可以执行类似

的操作
Given I have 2 posts
When I send "DELETE" to post with id 1
Then I should have 1 post

这样您就可以测试API的完整堆栈并检查结果。

答案 1 :(得分:0)

我们最近也遇到了类似的问题,例如仅在单元级别上进行测试是快速的,但不足以发现与集成相关的异常。

我真的很喜欢Cucumber的小黄瓜语法,对我来说,它的价值在于我们可以运行一次该练习,然后在使用单独的标题后做出一些期望,例如它们是否是单独的RSpec it块。

有一个名为Turnip的宝石,它使使用小黄瓜语法编写RSpec测试成为可能。我们已经使用了一段时间了,对此我感到非常满意,我们甚至开始减少了集成级别的缺陷。

我在博客文章https://blog.kalina.tech/2019/10/end-to-end-testing-for-api-only-rails-apps-with-cucumber-syntax.html

中收集了自己的经验