6

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

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

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

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

我的问题是:

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

2 回答 2

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 的完整堆栈并检查结果。

于 2011-06-15T13:09:25.550 回答
1

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

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

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

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

于 2019-10-28T17:02:34.693 回答