Разработка через тестирование (TDD) — это способ написания модульного теста перед написанием любого реального кода рецепта. Тест должен быть реальным и должен подтвердить, что делает рецепт. Это должно фактически потерпеть неудачу, поскольку не было никакого разработанного рецепта. Как только рецепт разработан, тест должен пройти.
ChefSpec построен на популярной платформе RSpec и предлагает специальный синтаксис для тестирования рецепта Chef.
Создание ChefSpec
Шаг 1 — Создайте гем-файл, содержащий гем chefSpec.
vipin@laptop:~/chef-repo $ subl Gemfile source 'https://rubygems.org' gem 'chefspec'
Шаг 2 — Установите драгоценный камень.
vipin@laptop:~/chef-repo $ bundler install Fetching gem metadata from https://rubygems.org/ ...TRUNCATED OUTPUT... Installing chefspec (1.3.1) Using bundler (1.3.5) Your bundle is complete!
Шаг 3 — Создайте каталог спецификаций.
vipin@laptop:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec
Шаг 4 — Создайте спецификацию
vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/spec/default_spec.rb require 'chefspec' describe 'my_cookbook::default' do let(:chef_run) { ChefSpec::ChefRunner.new( platform:'ubuntu', version:'12.04' ).converge(described_recipe) } it 'creates a greetings file, containing the platform name' do expect(chef_run).to create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!') end end
Шаг 5 — Подтвердите ChefSpec.
vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb F Failures: 1) <CookBook Name> ::default creates a greetings file, containing the platform name Failure/Error: expect(chef_run.converge(described_recipe)).to create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!') File content: does not match expected: Hello! ubuntu! # ./cookbooks/my_cookbook/spec/default_spec.rb:11:in `block (2 levels) in <top (required)>' Finished in 0.11152 seconds 1 example, 1 failure Failed examples: rspec ./cookbooks/my_cookbook/spec/default_spec.rb:10 # my_ cookbook::default creates a greetings file, containing the platform name
Шаг 6 — Редактировать рецепт поваренных книг по умолчанию.
vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb template '/tmp/greeting.txt' do variables greeting: 'Hello!' end
Шаг 7 — Создайте файл шаблона.
vipin@laptop:~/chef-repo $ subl cookbooks/< Cookbook Name>/recipes/default.rb <%= @greeting %> <%= node['platform'] %>!
Шаг 8 — Запустите rspec снова.
vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb . Finished in 0.10142 seconds 1 example, 0 failures
Как это устроено
Чтобы заставить его работать, нам нужно сначала настроить базовую инфраструктуру для использования RSpec с Chef. Затем нам нужен ChefSpec Ruby gem, а кулинарной книге нужен каталог spec, куда будут сохранены все тесты.