Ruby on rails Ruby/Rails测试实践

Ruby on rails Ruby/Rails测试实践,ruby-on-rails,ruby,testing,rspec,cucumber,Ruby On Rails,Ruby,Testing,Rspec,Cucumber,虽然我仍然认为自己是ruby/rails领域的一个不速之客,但我有兴趣就如何测试rails应用程序——使用哪些技术和覆盖级别以及何时使用——形成一种看法。我目前的政策是跟随我所从事的任何项目的发展,但这在技术和覆盖水平上产生了不一致的结果。唯一的一致性是测试优先的开发风格 Rspec用于控制器、模型和助手,Cumber用于函数(以简化测试优先开发),并使用test::Unit回填复杂的代码?所有的函数都是黄瓜吗?放弃测试::单元?测试::模型和助手的单元,以及其他所有内容的cucumber 请分

虽然我仍然认为自己是ruby/rails领域的一个不速之客,但我有兴趣就如何测试rails应用程序——使用哪些技术和覆盖级别以及何时使用——形成一种看法。我目前的政策是跟随我所从事的任何项目的发展,但这在技术和覆盖水平上产生了不一致的结果。唯一的一致性是测试优先的开发风格

Rspec用于控制器、模型和助手,Cumber用于函数(以简化测试优先开发),并使用test::Unit回填复杂的代码?所有的函数都是黄瓜吗?放弃测试::单元?测试::模型和助手的单元,以及其他所有内容的cucumber


请分享您的观点。

在测试应用程序时,最重要的事情之一,比您的测试框架或方法更重要的是编写可测试代码

如果您使用测试驱动的方法进行开发,您自然会倾向于编写可测试的代码,但是您仍然需要专注于为自己提供适当的工具。目标是拥有一个透明的应用程序

需要重点关注的事项包括:

  • 使您的方法专注于特定的函数,并在一种方法和另一种方法之间提供清晰的切换点
  • 为单元级对象的内部提供足够的自省,而不必暴露太多信息
  • 通过应用一致的术语和命名约定,创建结构更接近控制器和模型空间的HTML文档
我一直认为测试类似于魔术师所做的。魔术师清楚地说明了他们在做什么,结果是什么,但过程本身并不一定要解释。这就像软件一样,您想知道结果,但不应该关心实现细节

一个典型的魔术套路会向你展示所有相关的细节,比如表演者戴着一顶帽子,帽子是空的,袖子里什么都没有,帽子很结实,重量很轻,然后他们会设法从帽子里拿出一只兔子

就我个人而言,我更倾向于编写可靠的单元测试,通过精简控制器,减少对功能测试的重视。由于呈现页面时系统可能处于大量不可能的状态,因此要正确进行功能测试可能非常困难。由于您只能测试其中的一小部分,因此需要对验证进行优先级排序

集成测试适用于定义良好、缺陷成本非常高的成熟应用程序,但在其他方面,创建集成测试可能比严格的质量控制应用程序花费更多的时间。一个糟糕的集成测试可能会给你一种错误的安全感,并且可能会降低应用程序的质量


如果您有一个专门的QA部门,可以专注于构建和维护一整套回归测试,那么集成测试是一件很好的事情。然而,对于一般的开发人员来说,它最终会造成巨大的工作重复,并严重拖累生产力。就像很多事情一样,它是关于取舍的。

关于魔术师的好观点,很好的类比。只有我在很大程度上依赖于集成测试(与cucumber),不仅是在成熟的应用程序中,而且是为了让流程正常工作。我把所有东西都看作是集成测试,只是在不同的层面上:外部是cucumber,内部是RSpec测试模型(有时是控制器,如果它比传统的crud控制器更重要的话),但每个规范都是关于行为和隐藏食物链下游的细节。