SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
Test Driven Development
and
Puppet
Puppet Camp Paris
April 8, 2014
Johan De Wit
(johan@open-future.be)
Whoami
● Open Source Consultant @ open-future
● Organiser Belgian Puppet User Group
● A Sys-Admin
● A very poor developer (but working on it)
● Love riding :
● Bikes
● horses
Do you test your modules ?
I did !!
● 1: write a module
● 2: puppet parser validate ?
● 3: puppet-lint ?
● 4: puppet apply tests/init.pp (smoke)
● 5: puppet agent -t --noop
– You use vagrant – right ??
Start over again
●
Me => devops
●
Should be DEVops
– Yes, we write code to manage our infrastructure.
– Learn from Developers
● UNIT TESTING
● INTEGRATION TESTING
● ACCEPTANCE TESTING
● .....
Testing is great
● Confidence changing things
● Discover breaking things before deploy
● Test against # puppet & # ruby versions
● Test many os'es without deploying them
● Test early - fast feedback
● Prevent regression of old problems
First thing first
● Unit testing
– Rspec-puppet
– Start with testing, then coding
● It is the beginning of ..
– Integration testing (beaker)
– Travis
– Jenkins
– ....
Think colors
4
Test Puppet
Code
GoTest Driven Development
Source http://centricconsulting.com/agile-test-driven-development/
Benefits of TDD
● Test case from the beginning
● Better code coverage
● Tests are maintained during life cycle
● Focus on the needed functionality, step by step
● Encourage simple design (avoid over
engineering)
● First step in test automation (unit testing)
TDD does not
● Replace integration testing
● Replace compliance testing
● .......
Great ... but
TDD and puppet modules
●Write the docs first (README.md)
● Explain your parameters
● Describe the defaults
● What is the function of your module
● What is it intended behaviour
●Write the first test from the README
●Run the tests, all should fail
●Write just enough code to pass the test
●Refactor and reiterate the process
(Ted Arroway: Small moves, Ellie, small moves. [Contact] )
The right tools for the right job
● http://www.rvm.io
– Switch easily between ruby version
● Rspec-puppet
– Written by tim :
● http:/rspec-puppet.com
● https://github.com/rodjek/rspec-puppet
● Puppet module skeleton
– https://github.com/ghoneycutt/puppet-module-skeleton
– https://github.com/garethr/puppet-module-skeleton
– ...
TDD and rspec-puppet
● Testing against the compiled catalog
– Are the right resources in the catalogue
– With the right attributes
● Is the rspec a duplicate of the manifest code
– When you start – yes, because we start simple
– But we can copy/paste ? Right !!
– Refactoring a basic module shows already the benefits.
● Adding parameters
● Adding logic (eg. Support for multiple OS)
● ...
● Puppet modules with proper rspec test are better candidates
● It should/will become common to do PR including rspec tests
Hands on TDD
● Based on the TDD tutorial Garrett Honeycutt
– https://github.com/ghoneycutt/learnpuppet-tdd-vagrant
– https://github.com/ghoneycutt/puppet-module-skeleton
● Why ?
– Followed the TDD session on LOADays
– Everything is configured out of the box
– Easy to start doing it the right way
– Garrett learned me puppet
Hands on TDD – the setup
● The module directory tree
[root@puppet motd]# tree -a
.
|-- .fixtures.yml
|-- Gemfile
|-- .gitignore
|-- LICENSE
|-- manifests
| `-- init.pp
|-- Modulefile
|-- Rakefile
|-- README.md
|-- spec
| |-- classes
| | `-- init_spec.rb
| `-- spec_helper.rb
`-- .travis.yml
Hands on TDD – the setup
● puppet generate module witjoh-motd
● mv witjoh-motd motd
● Rakefile
[root@puppet motd]# rake -T
rake build # Build puppet module package
rake clean # Clean a built module package
rake coverage # Generate code coverage information
rake help # Display the list of available rake tasks
rake lint # Check puppet manifests with puppet-lint / Run
puppet-lint
rake spec # Run spec tests in a clean fixtures directory
rake spec_clean # Clean up the fixtures directory
rake spec_prep # Create the fixtures directory
rake spec_standalone # Run spec tests on an existing fixtures
directory
rake validate # Validate manifests, templates, and ruby files
Hands on TDD – the setup
● spec_helper.rb
– Code that is run before your spectest
– Configures your spec testing environment
[root@puppet spec]# cat spec_helper.rb
require 'rubygems'
require
'puppetlabs_spec_helper/module_spec_helper'
Hands on TDD – the setup
● .fixtures.yml
– Catalog dependencies are taken care off
● Resolves dependencies to other modules
● Creates symlink to own module
● (does not support metadata.json from forge modules)
[root@puppet motd]# cat .fixtures.yml
fixtures:
repositories:
stdlib:
repo: 'git://github.com/puppetlabs/puppetlabs-stdlib.git'
ref: '3.2.0'
symlinks:
motd: "#{source_dir}"
A Simple TDD Session
workflow
● Write README first
– Explain the function of your module
– Parameters
● Default values
● Valid values
● Write the test based on the readme
● Write the code
– Just enough code to pass the test
● Refactor and add more stuff
–
Hands on TDD – the test
● First test
– <module >/spec/classes/init_spec.rb
Rake validate
[root@puppet classes]# rake validate
(in /root/demos/motd)
puppet parser validate --noop
manifests/init.pp
ruby -c spec/classes/init_spec.rb
Syntax OK
ruby -c spec/spec_helper.rb
Syntax OK
[root@puppet classes]#
Hands on TDD – init_spec.rb
require 'spec_helper'
describe 'motd' do
context 'with defaults for all parameters' do
it { should contain_class('motd') }
it {
should contain_file('motd').with({
'ensure' => 'file',
'path' => '/etc/motd',
'owner' => 'root',
'group' => 'root',
'mode' => '0644',
'content' => nil,
})
}
end
end
Hands on TDD – Rake Spec
Hands on TDD – The code
# == Class: motd
#
# Module to manage motd
#
class motd {
file { 'motd':
ensure => 'file',
path => '/etc/motd',
owner => 'root',
group => 'root',
mode => '0644',
content => undef,
}
}
Hands on TDD – The test
More rspec
describe 'with path specified' do
context 'as a valid path' do
let(:params){{ :path => '/usr/local/etc/motd'}}
it {
should contain_file('motd').with({
'path' => '/usr/local/etc/motd',
})
}
end
context 'as an invalid path' do
let(:params) { { :path => 'invalid/path' } }
it 'should fail' do
expect {
should contain_class('motd')
}.to raise_error(Puppet::Error)
end
end
end
More rspec
['666','66666','invalid',true].each do |mode|
context "as invalid value #{mode}" do
let(:params) { { :motd_mode => mode } }
it 'should fail' do
expect {
should contain_class('motd')
}.to
raise_error(Puppet::Error,/^motd::mode must be
a four digit string./)
end
end
end
# package
it {
should contain_package('ntp_package').with({
... })
}
# file
it {
should contain_file('ntp_config').with({
...
'require' => 'Package[ntp]',
})
}
# service
it {
should contain_service('ntp_service').with({
...
'subscribe' => 'File[ntp_config]',
})
More rspec
# check for a specific line
it { should contain_file('ntp_conf').with_content(/^tinker
panic 0$/) }
# Check that some content is not include
it { should_not contain_file('ntp_conf').with_content(/^tinker
panic 0$/) }
More rspec
context 'with default values for parameters on EL 6' do
let(:facts) do
{ :osfamily => 'RedHat',
:lsbmajdistrelease => '6',
}
end
end
More rspec – defined resources
# spec/defines/mkdir_p_spec.rb
require 'spec_helper'
describe 'common::mkdir_p' do
context 'should create new directory' do
let(:title) { '/some/dir/structure' }
it {
should
contain_exec('mkdir_p-/some/dir/structure').with({
'command' => 'mkdir -p /some/dir/structure',
'unless' => 'test -d /some/dir/structure',
})
}
end
More rspec – defined resources
context 'should fail with a path that is not absolute' do
let(:title) { 'not/a/valid/absolute/path' }
it do
expect {
should contain_exec('mkdir_p-
not/a/valid/absolute/path').with({
'command' => 'mkdir -p
not/a/valid/absolute/path',
'unless' => 'test -d
not/a/valid/absolute/path',
})
}.to raise_error(Puppet::Error)
end
end
end
What should be tested
● All resources should be in the catalog
– 100% code coverage
● Parameters
– Proper defaults
– Setting params, does that work ?
– Logic of params
– Parameter validation
What should be tested
● Module logic
– Based on facts (eg: ::osfamily)
– Multiple os support
● Dynamic content
– Test your templates
Unit testing is the beginning
● Integration testing
● Acceptance testing
● ....
?
20140408 tdd puppetcamp-paris

Contenu connexe

Tendances

Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.Graham Dumpleton
 
Pytest - testing tips and useful plugins
Pytest - testing tips and useful pluginsPytest - testing tips and useful plugins
Pytest - testing tips and useful pluginsAndreu Vallbona Plazas
 
DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicGraham Dumpleton
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to GriffonJames Williams
 
Con-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistCon-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistAnton Arhipov
 
JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...
JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...
JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...Andrzej Jóźwiak
 
RSpec 3.0: Under the Covers
RSpec 3.0: Under the CoversRSpec 3.0: Under the Covers
RSpec 3.0: Under the CoversBrian Gesiak
 
Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)William Farrell
 
How to Reverse Engineer Web Applications
How to Reverse Engineer Web ApplicationsHow to Reverse Engineer Web Applications
How to Reverse Engineer Web ApplicationsJarrod Overson
 
Write code that writes code!
Write code that writes code!Write code that writes code!
Write code that writes code!Jason Feinstein
 
Voxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistVoxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistAnton Arhipov
 
Php Extensions for Dummies
Php Extensions for DummiesPhp Extensions for Dummies
Php Extensions for DummiesElizabeth Smith
 
Google C++ Testing Framework in Visual Studio 2008
Google C++ Testing Framework in Visual Studio 2008Google C++ Testing Framework in Visual Studio 2008
Google C++ Testing Framework in Visual Studio 2008Andrea Francia
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsAnton Arhipov
 
Python Testing Fundamentals
Python Testing FundamentalsPython Testing Fundamentals
Python Testing Fundamentalscbcunc
 
Lambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive CodeLambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive CodeIan Robertson
 
Perl Tidy Perl Critic
Perl Tidy Perl CriticPerl Tidy Perl Critic
Perl Tidy Perl Criticolegmmiller
 

Tendances (20)

Testing con spock
Testing con spockTesting con spock
Testing con spock
 
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
Hear no evil, see no evil, patch no evil: Or, how to monkey-patch safely.
 
Pytest - testing tips and useful plugins
Pytest - testing tips and useful pluginsPytest - testing tips and useful plugins
Pytest - testing tips and useful plugins
 
DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New Relic
 
Introduction to Griffon
Introduction to GriffonIntroduction to Griffon
Introduction to Griffon
 
Con-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With JavassistCon-FESS 2015 - Having Fun With Javassist
Con-FESS 2015 - Having Fun With Javassist
 
JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...
JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...
JUnit 4 Can it still teach us something? - Andrzej Jóźwiak - Kariera IT Łodź ...
 
RSpec 3.0: Under the Covers
RSpec 3.0: Under the CoversRSpec 3.0: Under the Covers
RSpec 3.0: Under the Covers
 
Puppet modules for Fun and Profit
Puppet modules for Fun and ProfitPuppet modules for Fun and Profit
Puppet modules for Fun and Profit
 
Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)
 
How to Reverse Engineer Web Applications
How to Reverse Engineer Web ApplicationsHow to Reverse Engineer Web Applications
How to Reverse Engineer Web Applications
 
Write code that writes code!
Write code that writes code!Write code that writes code!
Write code that writes code!
 
Voxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with JavassistVoxxed Days Vilnius 2015 - Having fun with Javassist
Voxxed Days Vilnius 2015 - Having fun with Javassist
 
Php Extensions for Dummies
Php Extensions for DummiesPhp Extensions for Dummies
Php Extensions for Dummies
 
Google C++ Testing Framework in Visual Studio 2008
Google C++ Testing Framework in Visual Studio 2008Google C++ Testing Framework in Visual Studio 2008
Google C++ Testing Framework in Visual Studio 2008
 
Oredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java AgentsOredev 2015 - Taming Java Agents
Oredev 2015 - Taming Java Agents
 
Python Testing Fundamentals
Python Testing FundamentalsPython Testing Fundamentals
Python Testing Fundamentals
 
Lambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive CodeLambda Chops - Recipes for Simpler, More Expressive Code
Lambda Chops - Recipes for Simpler, More Expressive Code
 
Introduce Django
Introduce DjangoIntroduce Django
Introduce Django
 
Perl Tidy Perl Critic
Perl Tidy Perl CriticPerl Tidy Perl Critic
Perl Tidy Perl Critic
 

En vedette

Bankacılık dijital ligi aralık 2013
Bankacılık dijital ligi aralık 2013Bankacılık dijital ligi aralık 2013
Bankacılık dijital ligi aralık 2013HesaplaBakalim.com
 
Test driven development_and_puppet-cfgmgmtcamp_eu-20140402
Test driven development_and_puppet-cfgmgmtcamp_eu-20140402Test driven development_and_puppet-cfgmgmtcamp_eu-20140402
Test driven development_and_puppet-cfgmgmtcamp_eu-20140402Johan De Wit
 
Zarafa collaboration
Zarafa collaborationZarafa collaboration
Zarafa collaborationJohan De Wit
 
Bankacalık Dijital Ligi Ağustos
Bankacalık Dijital Ligi AğustosBankacalık Dijital Ligi Ağustos
Bankacalık Dijital Ligi AğustosHesaplaBakalim.com
 
鲁洁文2012
鲁洁文2012鲁洁文2012
鲁洁文2012lujiewen
 
Totkay In Urdu Language
Totkay In Urdu LanguageTotkay In Urdu Language
Totkay In Urdu LanguageRiasat Ali
 
запись действий с экрана
запись действий с экраназапись действий с экрана
запись действий с экранаnftl1992
 
广告媒介的分析与选择
广告媒介的分析与选择广告媒介的分析与选择
广告媒介的分析与选择ericshj
 
Bpug mcollective 20140624
Bpug mcollective 20140624Bpug mcollective 20140624
Bpug mcollective 20140624Johan De Wit
 
Diamond biscuit
Diamond biscuitDiamond biscuit
Diamond biscuitMani Maran
 

En vedette (16)

Bankacılık dijital ligi aralık 2013
Bankacılık dijital ligi aralık 2013Bankacılık dijital ligi aralık 2013
Bankacılık dijital ligi aralık 2013
 
Test driven development_and_puppet-cfgmgmtcamp_eu-20140402
Test driven development_and_puppet-cfgmgmtcamp_eu-20140402Test driven development_and_puppet-cfgmgmtcamp_eu-20140402
Test driven development_and_puppet-cfgmgmtcamp_eu-20140402
 
Urdu shairi
Urdu shairiUrdu shairi
Urdu shairi
 
Bio info 5
Bio info 5Bio info 5
Bio info 5
 
Calidade do Ceo
Calidade do CeoCalidade do Ceo
Calidade do Ceo
 
Genetika dasar files-of-drsmed
Genetika dasar files-of-drsmedGenetika dasar files-of-drsmed
Genetika dasar files-of-drsmed
 
Zarafa collaboration
Zarafa collaborationZarafa collaboration
Zarafa collaboration
 
Bankacalık Dijital Ligi Ağustos
Bankacalık Dijital Ligi AğustosBankacalık Dijital Ligi Ağustos
Bankacalık Dijital Ligi Ağustos
 
鲁洁文2012
鲁洁文2012鲁洁文2012
鲁洁文2012
 
Totkay In Urdu Language
Totkay In Urdu LanguageTotkay In Urdu Language
Totkay In Urdu Language
 
запись действий с экрана
запись действий с экраназапись действий с экрана
запись действий с экрана
 
广告媒介的分析与选择
广告媒介的分析与选择广告媒介的分析与选择
广告媒介的分析与选择
 
MSS PROFILE(2014)
MSS PROFILE(2014)MSS PROFILE(2014)
MSS PROFILE(2014)
 
Bpug mcollective 20140624
Bpug mcollective 20140624Bpug mcollective 20140624
Bpug mcollective 20140624
 
Diamond biscuit
Diamond biscuitDiamond biscuit
Diamond biscuit
 
HesaplaBakalim.com
HesaplaBakalim.comHesaplaBakalim.com
HesaplaBakalim.com
 

Similaire à 20140408 tdd puppetcamp-paris

TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07garrett honeycutt
 
20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorialgarrett honeycutt
 
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Campmodern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet CampPuppet
 
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott NottinghamAutomated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott NottinghamPuppet
 
Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2nottings
 
Introduction to rails
Introduction to railsIntroduction to rails
Introduction to railsGo Asgard
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Brian Sam-Bodden
 
Strategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoringStrategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoringAlessandro Franceschi
 
Packaging perl (LPW2010)
Packaging perl (LPW2010)Packaging perl (LPW2010)
Packaging perl (LPW2010)p3castro
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPhil Zimmerman
 
2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratiehcderaad
 
Orchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorOrchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorRaphaël PINSON
 
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Puppet
 
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Puppet
 
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...Puppet
 
Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?
Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?
Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?NETWAYS
 
Creating a Mature Puppet System
Creating a Mature Puppet SystemCreating a Mature Puppet System
Creating a Mature Puppet SystemPuppet
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...Yury Bushmelev
 
Testing your infallibleness
Testing your infalliblenessTesting your infallibleness
Testing your infalliblenessCorey Osman
 
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T Puppet
 

Similaire à 20140408 tdd puppetcamp-paris (20)

TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
TDD with Puppet Tutorial presented at Cascadia IT Conference 2014-03-07
 
20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial20140406 loa days-tdd-with_puppet_tutorial
20140406 loa days-tdd-with_puppet_tutorial
 
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Campmodern module development - Ken Barber 2012 Edinburgh Puppet Camp
modern module development - Ken Barber 2012 Edinburgh Puppet Camp
 
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott NottinghamAutomated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
 
Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2
 
Introduction to rails
Introduction to railsIntroduction to rails
Introduction to rails
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013
 
Strategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoringStrategies for Puppet code upgrade and refactoring
Strategies for Puppet code upgrade and refactoring
 
Packaging perl (LPW2010)
Packaging perl (LPW2010)Packaging perl (LPW2010)
Packaging perl (LPW2010)
 
PuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With NotesPuppetConf 2014 Killer R10K Workflow With Notes
PuppetConf 2014 Killer R10K Workflow With Notes
 
2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie2014 11 20 Drupal 7 -> 8 test migratie
2014 11 20 Drupal 7 -> 8 test migratie
 
Orchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorOrchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and Mspectator
 
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf ...
 
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
 
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
Can you upgrade to Puppet 4.x? (Beginner) Can you upgrade to Puppet 4.x? (Beg...
 
Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?
Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?
Puppet Camp Duesseldorf 2014: Martin Alfke - Can you upgrade to puppet 4.x?
 
Creating a Mature Puppet System
Creating a Mature Puppet SystemCreating a Mature Puppet System
Creating a Mature Puppet System
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...
 
Testing your infallibleness
Testing your infalliblenessTesting your infallibleness
Testing your infallibleness
 
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T
PuppetConf 2016: Enjoying the Journey from Puppet 3.x to 4.x – Rob Nelson, AT&T
 

Dernier

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 

Dernier (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

20140408 tdd puppetcamp-paris

  • 1. Test Driven Development and Puppet Puppet Camp Paris April 8, 2014 Johan De Wit (johan@open-future.be)
  • 2. Whoami ● Open Source Consultant @ open-future ● Organiser Belgian Puppet User Group ● A Sys-Admin ● A very poor developer (but working on it) ● Love riding : ● Bikes ● horses
  • 3. Do you test your modules ? I did !! ● 1: write a module ● 2: puppet parser validate ? ● 3: puppet-lint ? ● 4: puppet apply tests/init.pp (smoke) ● 5: puppet agent -t --noop – You use vagrant – right ??
  • 4.
  • 5. Start over again ● Me => devops ● Should be DEVops – Yes, we write code to manage our infrastructure. – Learn from Developers ● UNIT TESTING ● INTEGRATION TESTING ● ACCEPTANCE TESTING ● .....
  • 6. Testing is great ● Confidence changing things ● Discover breaking things before deploy ● Test against # puppet & # ruby versions ● Test many os'es without deploying them ● Test early - fast feedback ● Prevent regression of old problems
  • 7. First thing first ● Unit testing – Rspec-puppet – Start with testing, then coding ● It is the beginning of .. – Integration testing (beaker) – Travis – Jenkins – ....
  • 9. GoTest Driven Development Source http://centricconsulting.com/agile-test-driven-development/
  • 10. Benefits of TDD ● Test case from the beginning ● Better code coverage ● Tests are maintained during life cycle ● Focus on the needed functionality, step by step ● Encourage simple design (avoid over engineering) ● First step in test automation (unit testing)
  • 11. TDD does not ● Replace integration testing ● Replace compliance testing ● .......
  • 13. TDD and puppet modules ●Write the docs first (README.md) ● Explain your parameters ● Describe the defaults ● What is the function of your module ● What is it intended behaviour ●Write the first test from the README ●Run the tests, all should fail ●Write just enough code to pass the test ●Refactor and reiterate the process (Ted Arroway: Small moves, Ellie, small moves. [Contact] )
  • 14. The right tools for the right job ● http://www.rvm.io – Switch easily between ruby version ● Rspec-puppet – Written by tim : ● http:/rspec-puppet.com ● https://github.com/rodjek/rspec-puppet ● Puppet module skeleton – https://github.com/ghoneycutt/puppet-module-skeleton – https://github.com/garethr/puppet-module-skeleton – ...
  • 15. TDD and rspec-puppet ● Testing against the compiled catalog – Are the right resources in the catalogue – With the right attributes ● Is the rspec a duplicate of the manifest code – When you start – yes, because we start simple – But we can copy/paste ? Right !! – Refactoring a basic module shows already the benefits. ● Adding parameters ● Adding logic (eg. Support for multiple OS) ● ... ● Puppet modules with proper rspec test are better candidates ● It should/will become common to do PR including rspec tests
  • 16. Hands on TDD ● Based on the TDD tutorial Garrett Honeycutt – https://github.com/ghoneycutt/learnpuppet-tdd-vagrant – https://github.com/ghoneycutt/puppet-module-skeleton ● Why ? – Followed the TDD session on LOADays – Everything is configured out of the box – Easy to start doing it the right way – Garrett learned me puppet
  • 17. Hands on TDD – the setup ● The module directory tree [root@puppet motd]# tree -a . |-- .fixtures.yml |-- Gemfile |-- .gitignore |-- LICENSE |-- manifests | `-- init.pp |-- Modulefile |-- Rakefile |-- README.md |-- spec | |-- classes | | `-- init_spec.rb | `-- spec_helper.rb `-- .travis.yml
  • 18. Hands on TDD – the setup ● puppet generate module witjoh-motd ● mv witjoh-motd motd ● Rakefile [root@puppet motd]# rake -T rake build # Build puppet module package rake clean # Clean a built module package rake coverage # Generate code coverage information rake help # Display the list of available rake tasks rake lint # Check puppet manifests with puppet-lint / Run puppet-lint rake spec # Run spec tests in a clean fixtures directory rake spec_clean # Clean up the fixtures directory rake spec_prep # Create the fixtures directory rake spec_standalone # Run spec tests on an existing fixtures directory rake validate # Validate manifests, templates, and ruby files
  • 19. Hands on TDD – the setup ● spec_helper.rb – Code that is run before your spectest – Configures your spec testing environment [root@puppet spec]# cat spec_helper.rb require 'rubygems' require 'puppetlabs_spec_helper/module_spec_helper'
  • 20. Hands on TDD – the setup ● .fixtures.yml – Catalog dependencies are taken care off ● Resolves dependencies to other modules ● Creates symlink to own module ● (does not support metadata.json from forge modules) [root@puppet motd]# cat .fixtures.yml fixtures: repositories: stdlib: repo: 'git://github.com/puppetlabs/puppetlabs-stdlib.git' ref: '3.2.0' symlinks: motd: "#{source_dir}"
  • 21. A Simple TDD Session workflow ● Write README first – Explain the function of your module – Parameters ● Default values ● Valid values ● Write the test based on the readme ● Write the code – Just enough code to pass the test ● Refactor and add more stuff –
  • 22. Hands on TDD – the test ● First test – <module >/spec/classes/init_spec.rb
  • 23. Rake validate [root@puppet classes]# rake validate (in /root/demos/motd) puppet parser validate --noop manifests/init.pp ruby -c spec/classes/init_spec.rb Syntax OK ruby -c spec/spec_helper.rb Syntax OK [root@puppet classes]#
  • 24. Hands on TDD – init_spec.rb require 'spec_helper' describe 'motd' do context 'with defaults for all parameters' do it { should contain_class('motd') } it { should contain_file('motd').with({ 'ensure' => 'file', 'path' => '/etc/motd', 'owner' => 'root', 'group' => 'root', 'mode' => '0644', 'content' => nil, }) } end end
  • 25. Hands on TDD – Rake Spec
  • 26. Hands on TDD – The code # == Class: motd # # Module to manage motd # class motd { file { 'motd': ensure => 'file', path => '/etc/motd', owner => 'root', group => 'root', mode => '0644', content => undef, } }
  • 27. Hands on TDD – The test
  • 28. More rspec describe 'with path specified' do context 'as a valid path' do let(:params){{ :path => '/usr/local/etc/motd'}} it { should contain_file('motd').with({ 'path' => '/usr/local/etc/motd', }) } end context 'as an invalid path' do let(:params) { { :path => 'invalid/path' } } it 'should fail' do expect { should contain_class('motd') }.to raise_error(Puppet::Error) end end end
  • 29. More rspec ['666','66666','invalid',true].each do |mode| context "as invalid value #{mode}" do let(:params) { { :motd_mode => mode } } it 'should fail' do expect { should contain_class('motd') }.to raise_error(Puppet::Error,/^motd::mode must be a four digit string./) end end end
  • 30. # package it { should contain_package('ntp_package').with({ ... }) } # file it { should contain_file('ntp_config').with({ ... 'require' => 'Package[ntp]', }) } # service it { should contain_service('ntp_service').with({ ... 'subscribe' => 'File[ntp_config]', })
  • 31. More rspec # check for a specific line it { should contain_file('ntp_conf').with_content(/^tinker panic 0$/) } # Check that some content is not include it { should_not contain_file('ntp_conf').with_content(/^tinker panic 0$/) }
  • 32. More rspec context 'with default values for parameters on EL 6' do let(:facts) do { :osfamily => 'RedHat', :lsbmajdistrelease => '6', } end end
  • 33. More rspec – defined resources # spec/defines/mkdir_p_spec.rb require 'spec_helper' describe 'common::mkdir_p' do context 'should create new directory' do let(:title) { '/some/dir/structure' } it { should contain_exec('mkdir_p-/some/dir/structure').with({ 'command' => 'mkdir -p /some/dir/structure', 'unless' => 'test -d /some/dir/structure', }) } end
  • 34. More rspec – defined resources context 'should fail with a path that is not absolute' do let(:title) { 'not/a/valid/absolute/path' } it do expect { should contain_exec('mkdir_p- not/a/valid/absolute/path').with({ 'command' => 'mkdir -p not/a/valid/absolute/path', 'unless' => 'test -d not/a/valid/absolute/path', }) }.to raise_error(Puppet::Error) end end end
  • 35. What should be tested ● All resources should be in the catalog – 100% code coverage ● Parameters – Proper defaults – Setting params, does that work ? – Logic of params – Parameter validation
  • 36. What should be tested ● Module logic – Based on facts (eg: ::osfamily) – Multiple os support ● Dynamic content – Test your templates
  • 37. Unit testing is the beginning ● Integration testing ● Acceptance testing ● ....
  • 38. ?