Chef - ChefSpec

Test Driven Development (TDD)ist eine Möglichkeit, einen Komponententest zu schreiben, bevor ein tatsächlicher Rezeptcode geschrieben wird. Der Test sollte real sein und validieren, was ein Rezept tut. Es sollte eigentlich scheitern, da kein Rezept entwickelt wurde. Sobald das Rezept entwickelt ist, sollte der Test bestehen.

ChefSpec basiert auf dem beliebten RSpec-Framework und bietet eine maßgeschneiderte Syntax zum Testen des Chef-Rezepts.

ChefSpec erstellen

Step 1 - Erstellen Sie eine Gem-Datei mit dem ChefSpec-Gem.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'chefspec'

Step 2 - Installieren Sie den Edelstein.

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!

Step 3 - Erstellen Sie ein Spezifikationsverzeichnis.

vipin@laptop:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec

Step 4 - Erstellen Sie eine Spezifikation

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

Step 5 - Überprüfen Sie 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

Step 6 - Standardrezept für Kochbücher bearbeiten.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
template '/tmp/greeting.txt' do 
   variables greeting: 'Hello!' 
end

Step 7 - Erstellen Sie eine Vorlagendatei.

vipin@laptop:~/chef-repo $ subl cookbooks/< Cookbook Name>/recipes/default.rb 
<%= @greeting %> <%= node['platform'] %>!

Step 8 - Führen Sie die rspec erneut aus.

vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
. 
Finished in 0.10142 seconds 
1 example, 0 failures

Wie es funktioniert

Damit es funktioniert, müssen wir zuerst die Basisinfrastruktur für die Verwendung von RSpec mit Chef einrichten. Dann müssen wir ChefSpec Ruby Gem und das Kochbuch benötigt ein Verzeichnis namens spec, in dem alle Tests gespeichert werden.