busser-rspec による Serverspec テスト #opschef_ja
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
Busser::RunnerPlugin::Rspec(以下 busser-rspec)とは、テストフレームワークBusserのRSpecプラグインです。
Cookbookテストフレームワークtest-kitchen 1.0にて、RSpecを用いたテストを行えます。
また、ServerspecはRSpecテストなので、Busser::RunnerPlugin::Serverspec(以下 busser-serverspec)を用いずにbusser-rspecで実行することも可能です。
Serverspecの適用
まず、作業マシンにてRubyGemsでServerspecをインストールしてください。
% gem install serverspec --no-rdoc --no-ri
Fetching: serverspec-0.5.0.gem (100%)
Successfully installed serverspec-0.5.0
1 gem installed
%
適用したいCookbookの test/integration/default/ ディレクトリに移動し、rspecディレクトリを作成、移動してください。
% cd apache2-take/test/integration/default
% mkdir rspec
%
busser-rspecには、内部でbundlerを用いてテストに必要なgemをインストールする仕組みがあります(lib/busser/runner_plugin/rspec.rb#L42)。
今回の場合、Serverspecでテストするため、インストール用のGemfileをapache2-take/test/integration/default/rspec/ ディレクトリに作成します。
% vi Gemfile
source 'https://rubygems.org'
gem 'serverspec'
%
serverspec-initコマンドを実行し、テストケース雛形を生成します。
% serverspec-init
Select a backend type:
1) SSH
2) Exec (local)
Select number: 2
+ spec/
+ spec/localhost/
+ spec/localhost/httpd_spec.rb
+ spec/spec_helper.rb
+ Rakefile
%
backend typeは2を選択してください。
busser-serverspecではRakefileの削除とspecディレクトリのリネームを行っていましたが、必要ありません。
% ls -RF rspec
rspec:
Gemfile Rakefile spec/
rspec/spec:
localhost/ spec_helper.rb
rspec/spec/localhost:
httpd_spec.rb
test/integration/default/serverspec/localhost/httpd_spec.rbがテストケース雛形です。これをリネームし、修正を加えていきます。
なお、*_spec.rbというファイル名でなければいけないことに注意してください。
% cd rspec/spec/localhost
% mv httpd_spec.rb apache2-take_spec.rb
% vi apache2-take_spec.rb
次のようにテストケースができました。
require 'spec_helper'
%w{ apache2 git-core curl unzip }.each do |i|
describe package( i ) do
it { should be_installed }
end
end
%w{ /etc/apache2/ports.conf /etc/apache2/sites-available/default }.each do |i|
describe file( i ) do
it { should be_file }
end
end
describe file( '/var/www/index.html' ) do
it { should be_file }
end
describe file( '/var/www/img' ) do
it { should be_directory }
end
describe service( 'apache2' ) do
it { should be_enabled }
it { should be_running }
end
これでtest-kitchenを実行してみます。
Chef Client finished, 14 resources updated
Finished converging (1m36.63s).
-----> Setting up
Fetching: thor-0.18.1.gem (100%)
Fetching: busser-0.4.1.gem (100%)
Successfully installed thor-0.18.1
Successfully installed busser-0.4.1
2 gems installed
Plugin rspec installed (version 0.7.0)
-----> Running postinstall for rspec plugin
Finished setting up (1m0.30s).
Chef Clientの実行によりCookbookの適用が終わった後、busserとbusser-rspecのインストールが行われます。
-----> Verifying
Suite path directory /opt/busser/suites does not exist, skipping.
Uploading /opt/busser/suites/rspec/Gemfile (mode=0644)
Uploading /opt/busser/suites/rspec/Rakefile (mode=0644)
Uploading /opt/busser/suites/rspec/spec/spec_helper.rb (mode=0644)
Uploading /opt/busser/suites/rspec/spec/localhost/apache2-take_spec.rb (mode=0644)
テストケースがインスタンスにコピーされます。
-----> Running rspec test suite
[2013-06-07T07:27:17+00:00] INFO: Run List is []
[2013-06-07T07:27:17+00:00] INFO: Run List expands to []
Recipe: (chef-apply cookbook)::(chef-apply recipe)
* execute[bundle install --local || bundle install] action run[2013-06-11T04:29:56+00:00] INFO: Processing execute[bundle install --local || bundle install] action run ((chef-apply cookbook)::(chef-apply recipe) line 42)
Resolving dependencies...
Using diff-lcs (1.2.4)
Using highline (1.6.18)
Using net-ssh (2.6.7)
Using rspec-core (2.13.1)
Using rspec-expectations (2.13.0)
Using rspec-mocks (2.13.1)
Using rspec (2.13.0)
Using serverspec (0.5.6)
Using bundler (1.3.5)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
[2013-06-07T07:27:17+00:00] INFO: execute[bundle install --local || bundle install] ran successfully
- execute bundle install --local || bundle install
bundlerでServerspecがインストールされます。
..........
Finished in 0.21711 seconds
10 examples, 0 failures
Finished verifying (0m8.91s).
RSpecからServerspecによるテストが実行されます。
問題なくすべてのテストをパスしました。
以上のようにbusser-rspecを用いることでもServerspecによるテストが行えました。
RSpecを利用した他のテストを行うことも可能と思われます。是非参考にしてみてください。