Chef - ChefSpec

Test Driven Development (TDD)est un moyen d'écrire un test unitaire avant d'écrire un code de recette réel. Le test doit être réel et doit valider ce que fait une recette. Il devrait en fait échouer car aucune recette n'a été élaborée. Une fois la recette élaborée, le test devrait réussir.

ChefSpec est basé sur le framework RSpec populaire et offre une syntaxe personnalisée pour tester la recette de Chef.

Création de ChefSpec

Step 1 - Créez un fichier de gemme contenant la gemme chefSpec.

[email protected]:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'chefspec'

Step 2 - Installez la gemme.

[email protected]:~/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 - Créez un répertoire de spécifications.

[email protected]:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec

Step 4 - Créer une spécification

[email protected]:~/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 - Validez ChefSpec.

[email protected]:~/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 - Modifier la recette par défaut des livres de cuisine.

[email protected]:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
template '/tmp/greeting.txt' do 
   variables greeting: 'Hello!' 
end

Step 7 - Créez un fichier modèle.

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

Step 8 - Exécutez à nouveau le rspec.

[email protected]:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
. 
Finished in 0.10142 seconds 
1 example, 0 failures

Comment ça fonctionne

Pour que cela fonctionne, nous devons d'abord configurer l'infrastructure de base pour utiliser RSpec avec Chef. Ensuite, nous avons besoin de ChefSpec Ruby gem et le livre de recettes a besoin d'un répertoire appelé spec où tous les tests seront enregistrés.