昨天参加深圳 Rubyist 聚会分享了《Rails 项目测试》。
Slide 在这里:http://yafeilee.me/RailsTest.pdf
在聚会期间有些朋友提到了一些测试相关的问题,整理如下:
如果觉得项目很紧很紧,可以分以下几个测试级别来考虑: 只写 Feature 测试覆盖正常流程,忽略各种单元测试 这样起码可以保证正常流程是不容易被破坏的。
如果做不到, 就只针对 Bug 写测试 。 出现 Bug 后,先编写测试用例重现 Bug,再进行修正。 这样可以保证以后这个 Bug 不会重现。
如果这个也无法做到,可以再退一步, 保证错误发生时,你能立即得到通知 ,减少错误的影响面。 可以使用 Exception Notification 来得到错误通知邮件。
熟悉测试之后,其实占用不了多少时间,写一个 Feature 测试也就几分钟的事情。
测试的内容也非常简单,就是两个方面:
这两方面占用的时间很少,反而是在此之前的数据准备占用的时间更多。 不过如果使用新版本的 Factory_Girl,有了 trait 特性,这方面也花不了多少时间。
这个要区分出不同测试类型的测试侧重点。 Model 测试侧重于与数据库相关的测试,包括与之相关的异常流程(校验不通过)。例如:
Controller 测试侧重于页面的交互,例如:
Feature 测试侧重于跨多个 Controller 或者 action 的功能测试,例如:
再具体点说明。
Controller 测试和 Model 测试如何避免重复? 例如:UserController 中的 create 调用后,我们当然可以测试 User 表有没有增加一条记录。但这就会导致与 Model 测试重复了。根据侧重点原则就知道要把这些测试移至 Model
Feature 测试和 Controller 测试如何避免重复? 例如,开发了注册用户功能后,先使用 Feature 测试注册成功;但是这个功能除了注册成功外,还有注册失败的流程,对于这个功能也可以使用 Feature 来进行测试,但为了避免重复,对于这样的异常流程尽量移到 Controller 测试。
总的来说,Feature 测试是最重要的,当我们开发完功能,手工测试一遍后,这个过程步骤一定要编写成 Feature 测试,由于 Feature 测试会模拟浏览器的行为,属于重型测试(时间较长)。所以尽量使用 Feature 来保证正常流程(注册成功),将异常流程(校验不通过注册失败)移到 Controller 测试或者 Model 测试。
我在测试过程一半时间会 TDD,其他则是事后补 Feature 测试。
具体分两个层面来看: 单元测试这一层,例如在 Controller, Model, Helper 等增加额外的方法,会 TDD。 而对于功能测试这一层,在创业项目中,有些功能高度不确定,得边想边做边完善,这种情况做 TDD 会花费更多的时间。