RSpec + Spork + Autotest 给Rails 3添加快速自动化测试

二 11th, 2012

这是我发现比较快速的方法,从头至尾,一共10步,很适合新手一步步照着做。

1、新建工程时不使用test-unit

rails new myapp --skip-test-unit

2、添加gem

修改Gemfile

group :development, :test do
  gem 'rspec-rails'	#会自动引用RSpec
  gem 'spork'		#引入Spork
  gem "autotest-rails"	#与ZenTest一起实现自动化测试
  gem "ZenTest"
end


安装

bundle install

3、配置rspec

rails generate rspec:install

会生成以下文件:
.rspec rspec配置。
spec/ 所有测试都在这个目录。
spec/spec_helper.rb

此时即可”bundle exec rspec spec/”或“rake”来执行RSpec测试。

4、Spork加速原理

RSpec默认每执行一次都要加载一次工程环境初始化一些数据,这要耗费很长时间。Sprok启动时会自动加载工程环境,然后生成几个fork分支,以DRb形式可供RSpec调用。所有在RSpec执行时就不必再重新加载工程环境。

5、安装Spork

spork --bootstrap

输出

Using RSpec
Bootstrapping /Users/peter/dev/rails/myapp/spec/spec_helper.rb.
Done. Edit /Users/peter/dev/rails/myapp/spec/spec_helper.rb now with your favorite text editor and follow the instructions.

上面做的就是修改spec/spec_helper.rb文件,在其头部添加了两段方法。Spork.prefork(只在启动时执行一次)和Spork.each_run(每次被RSpec调用时均被执行)。

6、修改RSpec配置,实现RSpec与Sprok交互

继续修改spec/spec_helper.rb,修改后大概如下:

require 'spork'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.infer_base_class_for_anonymous_controllers = false
  end

end

Spork.each_run do
  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
end

7、告诉RSpec我们使用的Spork

修改”.rspec”文件,在其中添加–drb,修改后”.rspec”的如下:

--colour
--drb

8、此时RSpec与Spork即可完美结合了

启动Spork方法

Spork

执行RSpec方法

bundle exec rspec spec/

此时会发现RSpec执行时间明显缩短了。但如果通过执行”rake”来启动RSpec,仍然会很慢,这是因为rake启动时会加载工程环境,为所有tasks做准备。

9、添加Autotest自动执行测试

启动Autotest

bundle exec autotest

Autotest就会自动启动,并监听文件变化,一旦改变,会立即执行改变部分相关的测试。
添加Autotest是最简单的,这是因为RSpec内部已经添加了对Autotest的一些支持,也是Rspec Rails推荐的做法。
简单也有一些问题,如Autotest自定义性不强,不够灵活。如果你追求自定义那就用Guard吧。

10、一个陷阱

此时当你修改app/models/person.rb时,可能并不会自动执行RSpec测试,这是因为Rails 的test环境默认对class做了缓存。
修改“config/environments/test.rb”

#config/environments/test.rb
#config.cache_classes = true #change this line to
config.cache_classes = false

参考链接:

autotest-rails: https://github.com/seattlerb/autotest-rails
rspec-rails: https://github.com/rspec/rspec-rails
Guard: https://github.com/guard/guard

Spork + Rails 3 + RSpec + Autotest + Growl实现Mac下快速自动化测试并Growl通知测试结果
http://mikbe.tk/2011/02/10/blazingly-fast-tests/
Spork + Rails 3 + RSpec + Watchr测试
http://www.rubyinside.com/how-to-rails-3-and-rspec-2-4336.html
Spork + Rails 3+ Cucumber + RSpec
http://chrismdp.github.com/2010/11/getting-spork-working-now-on-rails-3-rspec-2-and-cucumber/

>>原创文章,欢迎转载。转载请注明:转载自Ruby迷,谢谢!
>>原文链接地址:RSpec + Spork + Autotest 给Rails 3添加快速自动化测试
  1. Maxidas
    二 13th, 201215:23

    这文章很不错的,呵呵!

  2. Grant
    二 12th, 201223:02

    写的不错。非常期待到我搭建的ruby论坛担任大师啊!
    http://www.ruby-cn.net/
    我也是个ruby迷哦:) 呵呵

    • 老宋
      二 12th, 201223:50

      大师谈不上,论坛我会去。

  3. cqpx
    二 11th, 201222:10

    大哥可以试试guard,很方便,除了rspec还可以guard很多东西。
    guard的语法也很简单,可以很容易自定义需要监控哪些文件的变化,就不用像#10那样改文件

    guard-rspec
    guard-livereload
    guard-sass

    https://github.com/guard/guard/wiki/List-of-available-Guards

    • 老宋
      二 12th, 201211:30

      了解过guard,非常灵活,喜欢自定义的首选。

  4. PikachuEXE
    二 11th, 201221:02

    PikachuEXE :
    用Rubymine不能用bundle exec,要用rake,慢死了

    咦原来不是,我错了(死

    • 老宋
      二 12th, 201211:23

      可以试试rubymine,再加开个Terminal/Cmd,常用命令直接敲还快些。

      • PikachuEXE
        二 14th, 201215:29

        不,Rubymine可建立Rspec工作,而不需用超慢的Rake
        用Spork后十多秒就测试完

  5. PikachuEXE
    二 11th, 201220:52

    用Rubymine不能用bundle exec,要用rake,慢死了

  6. Jun Lin
    二 11th, 201216:54

    现在的项目里都用 guard-spin 感觉比spork好用

    • 老宋
      二 12th, 201211:38

      这个吗?https://github.com/vizjerai/guard-spin
      现在关注的人不多啊