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

时间:2015-08-21 14:37:09

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

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

  1. 为所有用户故事编写功能规范
  2. 编写控制器规范以确保各个操作响应正确并且设置了所有必需的变量
  3. 编写模型规范以确保所有方法,验证,e tc。正在按预期工作
  4. 撰写邮件规范
  5. 写路由规范
  6. 这是否足够,太多(例如,如果我编写了功能规格,我可以跳过一些较低级别的规格),还是不够?为什么呢?

2 个答案:

答案 0 :(得分:3)

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

测试完整性的最重要衡量标准是需求覆盖:它对每个用户故事以及每个需要新代码的故事的每个细节都有用,至少在一个测试中表示。如果您遵循典型的敏捷实践(提及用户故事表明您是这样),那么您的测试可能是您记录需求的唯一地方,因此您可能无法在此类覆盖范围内添加数字。

也很有帮助
  • 行覆盖率(大多数人在说测试覆盖时的意思),意味着每行代码至少由一次测试执行,
  • 集成覆盖,意味着从一个类到另一个类的每个方法调用都至少通过一次测试来执行。

对于每个故事,

  • 仅编写将测试所有故事的独特快乐路径的功能规格。
  • 编写其他功能规范,以确保集成覆盖建筑上有趣的快乐路径和悲伤路径的微小变化。例如,我经常为涉及表单的故事编写三个功能规范:一个用户填写每个可能的字段并成功,另一个用户填写尽可能少的信息并且仍然成功(确保未指定的值和默认值)按预期工作),用户犯错误,失败,纠正错误并成功。

此时,您已经测试了每一层(控制器,模型,视图,帮助器,邮件程序等),只有功能规格。

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

    请注意,尽管您的功能规范已经通过模型和帮助器方法测试了快乐路径,但只要您开始编写针对次要或错误情况的方法的示例,您可能希望编写happy-path示例或示例对于该方法,您也可以在一个地方看到该方法的完整描述,因此您可以通过运行其所有示例完全测试该方法,而不必运行任何功能规范。

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

  • 精心设计的控制器动作很短,很少或没有条件,因此您通常根本不需要任何控制器规格。只在需要时编写它们,并删除模型,邮件等行为,以保持简单和快速。
  • 同样,视图和邮件程序应该很少或没有条件(复杂的代码应该重构为帮助程序和模型方法),因此您通常根本不需要查看或邮件规范。
  • 您的功能规格将测试驱动您需要的所有路由,因此您可能不需要路由规范。当我不得不做一个主要的路由重构时,我只使用了路由规范,就像从一个主要版本的Rails升级到下一个版本时一样。

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

答案 1 :(得分:1)

该测试策略听起来非常全面。如果您已经完成了所有这些测试,那么您将获得很好的测试覆盖率。但是,交付项目需要更长的时间。作为进行更有限测试的人,你也不会敏捷。测试必须适合该项目。不要过度测试。过度测试可能会花费时间和金钱。不要接受测试。在测试中可能会花费时间和金钱。

有正确的方法进行单元测试。有正确的方法进行集成测试。手套必须适合。如果您的应用程序主要面向前端,那么最好从集成测试开始。如果您编写后端应用程序或API,那么单元测试可能是一个更好的起点。我认为接近一种测试方式,然后扩展到不同的样式是一个比尝试测试应用程序的每一层更好的开始。

为什么不从简单的单元测试开始?它们很容易写。编写这些测试,然后跟踪您发送的错误数量。你是否放入了太多的错误?你有很多回归问题吗?是否存在您的套件无法正常生产的错误?如果答案是肯定的,那么也许是时候写一些更高级别的测试了。请记住,测试的级别越高,您需要支付的开发成本就越高。

如果您没有发送错误,那么您没有理由再编写测试。记住这里的最终目标。我们想发送无bug代码。如果我们可以单独编写一个测试和一个测试来确保我们这样做,那么就没有理由进一步测试。

相关问题