If you were at PuppetConf 2013 last year, you may remember Luke announcing
[1] that we're working to support certain Forge modules with Puppet
Enterprise. One of the first steps on that path is testing modules against
Puppet Enterprise in addition to the testing done today against open-source
Puppet. Our answer is the Beaker acceptance testing harness [2]. Basically,
Beaker allows you to take a manifest, run Puppet to enforce it, and test
that the results of that Puppet run are what you expect. Here's a simple
example.

it "ensures apache works" do

 pp = "class { 'apache': }"

 apply_manifest(pp, :catch_failures => true)
end

describe service('httpd') do
 it { should be_running }
 it { should be_enabled }
end


In order to explain why we wrote Beaker, a brief history of module testing
is needed.

Unit testing is a common first step in module testing, typically
accomplished with rspec-puppet[3]. The rspec-puppet framework is written
and maintained by Tim Sharpe, with the help of 19 community members and
Puppet Labs employees. It tests that the Puppet catalog has everything you
expect it to contain. Rspec-puppet is a solid foundation for module
testing, especially to protect against regressions in your class interfaces
and underlying resources.

Complementary to unit testing with modules is acceptance testing. This
involves tests that validate the services running on a system managed with
Puppet. For example, if Puppet was meant to construct a postgresql server,
you might write a test that checks the response of a psql command that
binds to a newly-crafted database. rspec-system [4] by Ken Barber is a
testing framework for doing exactly that. Many Puppet Labs modules use
rspec-system for this manner of testing, as do many community modules. It
automates the creation of virtual machines, application of manifests on
them, and allows assertions to be made in an rspec-like DSL against those
machines. The only thing it doesn't do is run those tests against Puppet
Enterprise.

Naturally, Puppet Labs spends a lot of energy testing its open-source
projects along with Puppet Enterprise and had an internal framework called
puppet-acceptance to drive that activity, including some module testing. I
won't bore you with the details but puppet-acceptance had many facilities
for installing, configuring, and manipulating PE in various ways so that
it's thoroughly tested before it's released to you.

Beaker is effectively the best parts of rspec-system combined with
puppet-acceptance. We went this route for two big reasons. All of us at
Puppet Labs want one acceptance testing framework for the open-source
projects and PE, as well as for module testing. We also wanted the
flexibility provided by rspec-system along with its rspec-like DSL that's
familiar to anyone who writes rspec-puppet tests.

Our module engineering and QA teams have been working together on this
project, and the framework is still stabilizing. We've been migrating
existing rspec-system tests on a number of Puppet Labs modules to help
validate the Beaker framework and move it forward. When things are more
solidified, we'll be expanding on the existing documentation with a getting
started guide and a guide on migrating rspec-system tests should you wish
to. Though rspec-system and Beaker are intended for the same purpose, we
have no immediate plans to shutdown rspec-system. It's a useful tool, used
for many modules, and as I mentioned earlier, it served as inspiration for
many of the features in Beaker.

In the mean time, if you're interested in playing around with Beaker, you
can poke at and run the tests we have on puppetlabs-postgresql and
puppetlabs-apache [5], along with some other modules in the Puppet Labs
Forge namespace. Keep in mind that the documentation is still rough,
something we intend to address soon. That said, check out the wiki page on
writing a beaker test [6] and similarly a page on beaker itself [7].  It
can test against FOSS Puppet instead of PE by using setting 'type' to
'foss' in your yaml configuration.

I hope you find beaker a handy extension of what rspec-system does for you
today, and we thank you for your patience. We're trying to do a lot at once
over here and can't wait to apply the finishing touches to this and many
other projects.


[1] Luke's PuppetConf 2013 Keynote:
http://www.youtube.com/watch?v=Zx6L88k5alM
[2] Beaker Gem: https://rubygems.org/gems/beaker & Beaker project:
https://github.com/puppetlabs/beaker
[3] rspec-puppet: http://rspec-puppet.com/
[4] rspec-system: https://github.com/puppetlabs/rspec-system
[5] some modules with beaker tests:
https://github.com/puppetlabs/puppetlabs-postgresql/tree/master/spec/acceptance
 &
https://github.com/puppetlabs/puppetlabs-apache/tree/master/spec/acceptance
[6]
https://github.com/puppetlabs/beaker/wiki/How-to-Write-a-Beaker-Test-for-a-Module
[7] https://github.com/puppetlabs/beaker/wiki/How-To-Beaker


--
Ryan Coleman | Modules & Forge | ryanycoleman on twitter & #puppet IRC

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-dev/CAFkZv1ugX_a--oicLPfj2DK8k46bCO3yqDRjXMfNVXbjpm9RyQ%40mail.gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to