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

Posted

技术标签:

【中文标题】端到端测试 RESTful Web 服务 (Rails)【英文标题】:End-to-end testing a RESTful Web service (Rails) 【发布时间】:2011-06-15 09:00:35 【问题描述】:

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

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

我意识到,理论上,如果测试套件设计得非常好,模拟只发生在下一层测试开始的那些连接点,然后通过单元或功能测试服务 API 和移动网站分开,一个人可以获得相同的测试覆盖率。我发现在实践中,如果您有多个开发人员独立开发测试套件,这是一种错觉。我只是承认我们的单元测试根本没有设计得那么好。特别是在练习 TDD 时,我发现虽然测试可以驱动应用程序代码,但测试代码设计仅针对被测单元量身定制,从而导致测试套件相当广泛地增长。

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

我的问题是:

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

【问题讨论】:

我想知道 Capybara/WebRat 与 Mechanize 作为驱动的组合是否是一个不错的选择? 【参考方案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 的完整堆栈并检查结果。

【讨论】:

其实,你对“相似”有什么建议吗?我们不想做 Cucumber,因为 API 验收测试是由开发人员读写的,我实际上更喜欢更底层的测试描述。这就是我最初倾向于 Capybara+Mechanize 的原因。知道如何将 RestClient(我喜欢那个,它似乎与 OAuth 很好地集成)与任何可以让我编写比您的平均 Test::Unit 更具表现力的测试的东西集成吗? 现在正在考虑 rspec、shouda 和 matchy,或三者的某种组合。选择太多! 由于规范只能由开发人员读取/编写,因此您可以不使用 Cucumber,并坚持使用 RSpec 进行个人/分区测试(RSpeck 有自己的模拟系统和匹配器)。也就是说,如果您想通过跨多个 API 请求的集成场景来练习完整堆栈(例如,从 API 获取这些记录,然后使用 API 删除它们的所有子项),Cucumber 仍然非常方便。 我现在已经为我们的 API 项目设置了 RSpec,并打算将它与 RestClient 结合起来。我已经实现了一些规范,看起来这正是我的想法。非常感谢! 没问题,很高兴能帮您找到解决方案!【参考方案2】:

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

我真的很喜欢 Cucumber 的 gherkin 语法,对我来说,它的价值在于我们可以运行一次练习,然后在使用单独的标题之后做出几个期望,就像它们是单独的 RSpec it 块一样。

有一个名为 Turnip 的 gem,它可以使用 gherkin 语法编写 RSpec 测试。我们已经使用它一段时间了,我对它非常满意,我们甚至开始减少集成级别的缺陷。

我在一篇博文中收集了我的经验:https://blog.kalina.tech/2019/10/end-to-end-testing-for-api-only-rails-apps-with-cucumber-syntax.html

【讨论】:

以上是关于端到端测试 RESTful Web 服务 (Rails)的主要内容,如果未能解决你的问题,请参考以下文章

端到端测试大数据管道的工具?

五款最热的Node.js端到端测试框架评测

在端到端测试中捕获服务器 JSON 响应

最受欢迎的 5 款 Node.js 端到端测试框架

如何将跨微服务的端到端测试包含到多个持续交付管道中?

nightwatch 基于Webdriver的端到端自动化测试框架