ようへいの日々精進XP

よかろうもん

test-kitchen + kitchen-docker と serverspec で cookbook をテストする

はじめに


参考


準備

test-kitchenkitchen-docker 等は既にインストールされているという状態から...

serverspec のインストール

sudo gem install serverspec --no-ri --no-rdoc -V

cookbook の test ディレクトリに spec ファイルを置く

今回はこちらの cookbook を使ってテストする。

mkdir elasticsearch_cookbook/test/integration/default/serverspec

上記の spec ファイルを設置する serverspec ディレクトリを作成して *_spec.rb を作成する。

vim elasticsearch_cookbook/test/integration/default/serverspec/check_spec.rb

check_spec.rb の中身は以下の通り。

require 'serverspec'

include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS

RSpec.configure do |c|
  c.before :all do
    c.path = '/sbin:/usr/sbin'
  end
end

describe package('elasticsearch') do
  it { should be_installed }
end

describe process('java') do
  it { should be_running }
  its(:args) { should match /elasticsearch/ }
end

テストしてみる

とにかく流れを見る

test-kitchen の使い方はこちらを参考にしつつ kitchen verify を実行する。

kitchen verify

そして暫くすると...

f:id:inokara:20140208104952p:plain

上記のように cookbook をテスト用の docker コンテナに適用後、serverspec を利用する準備として busser の設定と busser プラグインbusser-serverspec がインストールされて serverspec によるテストが開始される。

以下はおまけ。kitchen verify した後で kitchen list してさらに kitchen verify している動画。serverspec が動作していることがわかるかな。

ついでに recipe を修正して kitchen converge してからの kitchen verify の流れ。

字がちっちゃいけど雰囲気は伝わるかな...

busser とは

今更で大変恐縮だが busser とは...

Busser is a test setup and execution framework designed to work on remote nodes whose system dependencies cannot be relied upon, except for an Omnibus installation of Chef. It uses a plugin architecture to add support for different testing strategies such minitest, cucumber, bash, etc.

上記の通り、プラグインアーキテクチャを採用したリモートホストで動作するように設計されたテストフレームワーク。今回、そのプラグインの一つとして busser-serverspec を利用して cookbook を適用したコンテナに対してテストを行うことになる。


最後に

  • kitchen-testserverspec を連携させることで kitchen コマンドで serverspec でのテストが行えるようになってテストがより身近に感じられた
  • 今後は cookbook を書く場合には test-kitchen + serverspec でテストをすることにしたい
  • 「はじめに」にも記載したが、海外でも serverspec が広く受け入れられていて本当に素晴らしいと思う