特定于Rails/工具的版本:How deep are your unit tests?

现在,我正在写:

  • Cucumber特性(集成测试)——这些测试针对我们的应用程序返回的HTML/JS,但有时也测试其他东西,比如对第三方服务的调用.
  • RSpec控制器测试(功能测试),最初仅当控制器有任何有意义的逻辑时,但现在越来越多.
  • RSpec模型测试(单元测试)

有时这是完全必要的;有必要在模型中测试最终用户不完全明显或不可见的行为.当模型很复杂时,一定要对它们进行测试.但其他时候,在我看来,这些测试是多余的.例如,如果方法foo只被bar调用,而bar被测试,你会测试它吗?如果bar是一个模型上的简单辅助方法,该模型由Cucumber特性使用且易于测试,该怎么办?你在rspec和Cucumber中测试过这种方法吗?我发现自己很难做到这一点,因为编写更多的测试需要时间,并且维护实际上相同行为的多个"版本",这使得维护测试套件更加耗时,这反过来又使得更改更加昂贵.

简言之,你认为有一段时间只写黄瓜特性就足够了吗?或者你应该在每个级别都进行测试?如果您认为存在灰色区域,那么"这需要功能/单元测试"的阈值是多少实际上,你目前在做什么?为什么(或为什么不)你认为这是足够的?


EDIT:Here's an example of what might be "test overkill."不可否认,我写这篇文章很快,但它完全是假设性的.

推荐答案

好问题,我最近在使用Cucumber/RSpec开发Rails应用程序时遇到了这个问题.我试着在每一个级别上尽可能多地测试,然而,我也发现随着代码库的增长,我有时会觉得自己在重复不必要的内容.

Using "Outside-in" testing, my process usually goes something like: Cucumber Scenario -> Controller Spec -> Model Spec. More and more I find myself skipping over the controller specs as the cucumber scenarios cover much of their functionality. I usually go back and add the controller specs, but it can feel like a bit of a chore.

我经常采取的一个步骤是在我的cucumber功能上运行rcov,并在覆盖率上寻找明显的差距.无论是单元测试还是集成测试,这些都是我确保重点关注的代码领域,因此它们具有良好的覆盖率.

我认为模型/库应该立即进行广泛的单元测试,因为它是核心业务逻辑.它需要在正常的web请求/响应过程之外独立工作.例如,如果我通过Rails控制台与我的应用程序交互,我直接使用业务逻辑,我希望确保我在模型/类上调用的方法经过良好测试.

我认为,当你的应用程序在每一天的测试中都会遇到不同的问题时,你会发现你的应用程序在测试中的覆盖范围会有所不同.

下面是我从书签中找到的一篇有趣的文章,值得一读:

Ruby-on-rails相关问答推荐

将两个日期之间的差值转换为Ruby中的iso8601持续时间(如果需要,还可以使用Rails)

带有块捕获的 FormBuilder 辅助方法在 ERB 中不起作用

无法在生产服务器上启动 Rails 4 控制台

Rails - 如何使用子对象的嵌套属性和强参数填充父对象ID?

如何使用 Vim 插入 ERB 标签?

为 ActionMailer 渲染不同的视图(模板)

如何使用默认的 Rails 记录器记录 Ruby 异常的整个回溯?

将 defer 属性添加到 javascript_include_tag Rails

奇怪的406 不可接受错误

是否有不涉及删除 Gemfile.lock 的在任何源中找不到 *gem*错误的修复?

使用 oauth 和 twitter ruby​​ gem 时不断收到 OAuth::Unauthorized 错误

我如何找出为什么我不能#destroy() 记录?

如何让 ActiveAdmin 使用强参数?

如何为模型添加属性?

有没有办法列出所有 belongs_to 关联?

Ruby on Rails i18n - 想要在模型中翻译自定义消息

如何在两个字段上对 ruby​​/rails 进行排序?

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?

如何拆分长行的 Ruby

ruby on rails 如何处理 NaN