Rails项目持久集成工具:RSpec+Guard+Spork
Rails CI: 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