Hegwin.Me

南朝四百八十寺,多少楼台烟雨中。

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

Rails CI: RSpec+Guard+Spork

RSpec,Ruby中的一个测试框架,可以用于给Ruby on Rails写测试,也可以用于纯Ruby项目。

Guard,“人”如其名,监视着项目中的所有文件,当项目中某个文件发生变化,便会根据配置去启动相应的测试脚本。

Spork,可以将其认为是一种懒加载服务,自动加载了Rails项目所有文件,当文件发生变化时才会重新加载有变化的那部分文件,这样就减少了测试启动时加载的时间,大大缩短了测试的准备时间。当然,随着Ruby2.0的到来,这个组件的必要性可能就没那么大了。

他们三者在一起的作用就是,当你把代码push某个运行着Guard服务的服务器上,他会自动运行相应的测试脚本,并将结果按照某种预定的方式传达给开发人员。更进一步,如果有其他组件的配合,便可以达到持久集成(CI)的效果了;在功能上,也可以做到优先启动上次失败的测试用例。

RSpec

这套测试框架,容易上手,是Rails项目比较常选择的测试框架。比起默认的UnitTest框架,RSpec在灵活性和代码可读性上都更好;它也很适合用于在BDD(behavior-driven development)开发。此外,RSpec 社区支持更完备,方便提问和找答案。

不过这篇文章的目的并非介绍RSpec的,所以对其不做过多的介绍了。更多的信息可以去参考 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
< Back