Ускорение запуска Chefspec

У меня много кулинарных книг, и они тщательно протестированы с помощью ChefSpec. У меня более 800 спецификаций, и запускать их каждый раз перед фиксацией кода стало проблемой, потому что на моей машине их запуск занимает около 20 минут. Это составляет ~0,(6) с на спецификацию, что немного, но в сумме занимает много времени.

Есть ли возможность запускать тесты ChefSpec/RSpec параллельно или как-то еще увеличить скорость?


person Draco Ater    schedule 10.12.2013    source источник


Ответы (1)


Обновление от 4 января 2014 г.. В ChefSpec теперь реализована следующая идея (>= 3.1.2). См. часть Faster Specs в Readme.

================================

Это выдержка из сообщения в блоге, который раскрывает эту тему с некоторыми дополнительными подробностями.

RSpec позволяет расширять модули с помощью ваших собственных методов, и идея состоит в том, чтобы написать метод, аналогичный let, но который также будет кэшировать результаты в примерах. Создайте файл *spec_helper.rb* где-нибудь в вашем проекте Chef и добавьте туда следующие строки:

module SpecHelper
  @@cache = {}
  def shared( name, &block )
    location = ancestors.first.metadata[:example_group][:location]
    define_method( name ) do
      @@cache[location + name.to_s] ||= instance_eval( &block )
    end
  end

  def shared!( name, &block )
    shared name, &block
    before { __send__ name }
  end
end

RSpec.configure do |config|
  config.extend SpecHelper
end

Значения из @@cache никогда не удаляются, и вы можете использовать те же имена с этим блоком, поэтому я также использую место использования, которое выглядит так: "./cookbooks/my_cookbook/spec/default_spec .рб:3". Теперь измените let( :chef_run ) на shared( :chef_run ) в своих спецификациях:

describe "example::default" do
  shared( :chef_run ) { ChefSpec::ChefRunner.new.converge described_recipe }
  [...]
end

И при запуске тестов вам также нужно будет включить spec_helper.rb:

rspec --include ./relative/path/spec_helper.rb cookbooks/*/spec/*_spec.rb
person Draco Ater    schedule 10.12.2013