ruby-on-rails - 我应该如何使用 RSpec 测试 Rails 应用程序以获得完整的测试覆盖率?

标签 ruby-on-rails ruby rspec code-coverage rspec-rails

在为简单的 Rails 应用编写规范时,以下是否是完整测试覆盖率的正确方法?

  1. 为所有用户故事编写功能规范
  2. 编写 Controller 规范以确保各个 Action 响应正确并设置所有必需的变量
  3. 编写模型规范以确保所有方法、验证等。正在按预期工作
  4. 编写邮件规范
  5. 编写路由规范

这是否足够、太多(例如,如果我已经编写了功能规范,我可以跳过一些较低级别的规范)还是不够?为什么?

最佳答案

您无需为每一层中的每个对象编写规范以获得 100% 的测试覆盖率或测试驱动(要求您实现)应用程序中的所有重要行为。相反,正如行为驱动开发 (BDD) 所建议的那样,从外向内编写规范,并仅在必要时编写较低级别的规范。

测试完整性最重要的衡量标准是需求覆盖率:它有助于每个用户故事,以及每个需要新代码的故事的每个细节,至少在一次测试中表现出来。如果您正在遵循典型的敏捷实践(提到用户故事表明您是),您的测试可能是您记录需求的唯一地方,因此您可能无法在这种覆盖率上加上数字。这也很有帮助

  • 行覆盖率(大多数人说测试覆盖率时的意思),意思是每一行代码都至少执行一次测试,并且
  • 集成覆盖率,这意味着从一个类到另一个类的每个方法调用都至少经过一次测试。

对于每个故事,

  • 只编写能够测试故事中所有不同快乐路径的功能规范。
  • 编写额外的功能规范,以确保集成覆盖快乐路径和悲伤路径的架构上有趣的微小变化。例如,我经常为涉及表单的故事编写三个功能规范:一个是用户填写所有可能的字段并成功,另一个是用户填写尽可能少的信息但仍然成功(确保未指定的值和默认值按预期工作),以及用户犯错、失败、纠正错误并成功的情况。

此时,您已经测试驱动每一层( Controller 、模型、 View 、助手、邮件程序等),只有功能规范。

  • 编写模型和帮助程序规范以提出完全存在于这些类中的详细要求。例如,一旦你写了一个单一的 sad-path 特性规范,确定输入一个特定的无效属性会让用户返回编辑他们的表单提交并显示一条消息,你可以通过在其中编写更多示例来完全处理其他无效属性测试模型属性是否已验证的模型规范,并让您已经测试驱动的架构将错误传播回用户。

    请注意,尽管您的功能规范已经通过模型和辅助方法测试了快乐路径,但是一旦您开始为轻微或错误情况的方法编写示例,您可能想要编写一个或多个快乐路径示例也适用于该方法,因此您可以在一个地方看到该方法的完整描述,因此您可以通过运行所有示例来全面测试该方法,而不必运行任何功能规范。

您可能根本不需要某些规范:

  • 结构合理的 Controller Action 很短,很少或没有条件,因此您通常根本不需要任何 Controller 规范。仅在需要时编写它们,并剔除模型、邮件程序等行为,以保持它们的简单和快速。
  • 同样, View 和邮件程序应很少或没有条件(复杂代码应重构为帮助程序和模型方法),因此您通常根本不需要 View 或邮件程序规范。
  • 您的功能规范将测试驱动您需要的所有路由,因此您可能不需要路由规范。我只在必须对路由进行重大重构时才会用到路由规范,例如从 Rails 的一个主要版本升级到下一个版本时。

只要您始终在编写新代码之前编写测试,您将始终拥有 100% 的行覆盖率。

关于ruby-on-rails - 我应该如何使用 RSpec 测试 Rails 应用程序以获得完整的测试覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32143107/

相关文章:

ruby-on-rails - Rails 开发 Mac OS 或 Windows

javascript - 如何使 JavaScript 不在 Rails 中应用整个页面?

ruby-on-rails - 按数据对 JSON 进行分组?

ruby - -bash :/usr/bin/bundle:/System/Library/Frameworks/Ruby. framework/Versions/1.8/usr/bin/ruby: 错误的解释器:没有这样的文件或目录

ruby - RSpec:模拟、 stub 和验证

ruby-on-rails - 设计 - 将 OAuth 与现有帐户合并

ruby-on-rails - Rails 表单未将输入保存到数据库

mysql - 将邮件消息解析为ruby中的数据库

ruby - 是否可以在 RSpec 中使用参数化规范?

ruby-on-rails - Rails/Rspec : Testing delayed_job mails