Hegwin.Me

无边落木萧萧下,不尽长江滚滚来。

Rails项目持久集成工具:RSpec+Guard+Spork

RSpec是Rails的一套测试框架。
Guard,人如其名,监视着项目中的所有文件,当项目中某个文件发生变化,便会根据配置去启动相应的测试脚本。
Spork,可以将其认为是一种服务,自动加载了Rails项目所有文件,当文件发生变化时才会重新加载部分文件,这样就减少了测试启动时加载的时间,大大缩短了测试的准备时间。当然随着Ruby2.0的到来,这个组件的必要性可能就没那么大。

他们三者在一起的作用就是,当你把代码push某个跑着Guard服务的测试机上,他会自动运行相应的测试脚本,并将结果按照某种预定的好的方式传达给开发人员。甚至在配合其他组件之后,便是CI的范畴了;也可以做到优先启动上次失败的测试脚本之类的行为。

RSpec

这东西吧,还算好上手,是Rails项目比较常选择的测试框架。
不过这里并非介绍Rspec本身的,所以对其不做过多的说明

Guard

安装

gem 'guard-rspec'添加到Gemfile中,然后 bundle install

另外,我们还需要一些特定的gem,这些gem依赖于系统。Mac用户可能还要先安装 Growl and growlnotify 。好了,说白了,下面这些东西无非就是调用系统的通知功能。

# Test gems on Macintosh OS X          
gem 'rb-fsevent', '0.9.1', :require => false
gem 'growl', '1.0.3'                      

# Test gems on Linux          
gem 'rb-inotify', '0.8.8'
gem 'libnotify', '0.5.9'

# Test gems on Windows          
gem 'rb-fchange', '0.0.5'
gem 'rb-notifu', '0.0.4'
gem 'win32console', '1.3.0' 

初始化

$ bundle exec guard init rspec 

配置

初始化之后会在根目录有个Guardfile的文件,里面主要就是“什么文件变化后,改进行哪些测试”。

启动

$ bundel exec gurad 

然后你可以随便改个文件试试,看他有没有运行相应的测试。

Spork

这个东西有好有坏,预加载的结果是测试的准备时间减少了,但是如果某些配置文件修改之后,可能要重启这个服务才行。
不过效果是明显的,下面是相同的测试的用时对比:

使用前:

real 0m3.743s
user 0m3.388s
sys 0m0.184s

使用后

real 0m0.746s
user 0m0.316s
sys 0m0.024s

Spork可以与Guard相结合,可以直接启动Guard,他会自己去运行Spork服务。

安装:

gem 'guard-spork'
gem 'spork' 

引导(配置):

$ bundle exec spork --bootstrap 

执行了上面这个命令之后,spec/spec_helper.rb 文件会有变化
现在需要把这个文件内原先的内容,放到Spork.prefork的block中。

Spork.prefork do                                                           
  # ...
end 

运行:

$ bundle exec spork                         
Using RSpec
Loading Spork.prefork block...
Spork is ready and listening on 8989! 

这时候跑测试时,在后面加个参数--drb就可以看到效果了。

Guard with Spork

$ bundle exec guard init spork 

这个命令执行完之后Guardfile会被修改,不过我们一般不用改什么。
然后启动guard时,spork就会同时被启动了。

$ bundle exec guard

Tags:

Posted on: 2013-03-14

Back