SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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
Graham Dumpleton
 
Php Extensions for Dummies
Php Extensions for DummiesPhp Extensions for Dummies
Php Extensions for Dummies
Elizabeth Smith
 

Was ist angesagt? (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
 

Andere mochten auch

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
HesaplaBakalim.com
 
запись действий с экрана
запись действий с экраназапись действий с экрана
запись действий с экрана
nftl1992
 

Andere mochten auch (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
 

Ähnlich wie 20140408 tdd puppetcamp-paris

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
garrett 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 Camp
Puppet
 
Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2
nottings
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 

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. ?