我现在在做的 GuruDigger 项目一直没有用测试框架, 最近我做了几次大的重构, 结果出现了许多bug, 为了能够保证以后项目不会在重构中挂掉, 我还是需要把测试给整起来.
rails的测试框架用得比较多的是rspec.
rspec的原理
我们有一段代码:
1 2 3 4 5 |
|
我们需要给出一个单元测试. rspec的写法是这样的:
1 2 3 4 5 6 7 |
|
我们来解释一下. 里面的describe和it是什么意思呢? rspec里面的测试是采用描述性的方式进行的. describe说明具体描述的是什么东西, it指代这个东西它的行为应该是怎么样. 上面的代码一方面做好了测试, 另外一方面也直观地描述了这个方法需要做的事情, 符合人类直觉.
然后, 我们看具体验证的部分. 和其他单元测试框架的 assert_equal 函数不同, rspec-expectations 修改了Kernel, 给了一个should方法. 这样让原先的外层函数调用, 变成了内层的方法调用, 造成的结果就是写起来超级直观. 这个算是ruby比较常用的套路了.
should的写法可以去看 rspec-expectations的文档.
https://github.com/rspec/rspec-mocks 这一块不太容易懂, 需要看看.
factory_girl
factory_girl是取代rails默认生成测试数据的yml格式的一种写法, 原生ruby, 写起来比较舒服和能够嵌入ruby代码.
1 2 3 4 5 6 7 8 9 10 11 |
|
网上也有很详细的教程:
https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md
rspec和rails整合
上面是rspec做测试的部分, 下面我们看如何和rails整合. 其实文档都全了, 我觉得大家还是直接去看官方的文档就好:
https://github.com/rspec/rspec-rails
重点是测试的几个类型.
rspec加上spork
rspec跑一遍下来超级慢, 于是就有了 spork 这样的东西. 原理就是先跑一个服务器, 加载好对应的环境. 然后需要执行测试的时候, 就通知这个服务器开始测试. 服务器会fork一下, 执行对应的测试.
如何使用上面的文档都有. 重点是几步:
- 用spork —bootstrap初始化spec_helper.rb, 把每次fork需要做的事情填到对应的方法里面去.
- 跑服务器, 执行spork
- 跑测试. 执行rspec —drb
配置
这里有别人贴出来的配置, 还是挺复杂的, 需要搞搞清楚. 但是搞清楚了, 开发起来你会发现非常舒服(前提是你的机器够好…) https://gist.github.com/1191428
一些资料
rspec书籍: http://pragprog.com/book/achbd/the-rspec-book
rspec cheetsheet: http://cheat.errtheblog.com/s/rspec/
capybara cheetsheet: https://gist.github.com/428105 http://cheat.errtheblog.com/s/rspec_shoulda/
rspec最佳实践: http://eggsonbread.com/2010/03/28/my-rspec-best-practices-and-tips/