Cookbookテストフレームワーク「test-kitchen」後編 #opschef_ja
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
前編ではtest-kitchen環境の準備と簡易テストまでを行いました。
本稿では後編として、MiniTest::SpecというBDDのためのテストフレームワークを用いたテストケースを作成します。
BDD(Behavior Driven Development)とは、ビヘイビア駆動開発、振舞駆動開発と訳され、作成するプログラムがどのように振る舞うのか、どのような動作が期待されるのか、という観点から自然言語に近い形でテストケースを作成し、開発を行っていく手法です。
MiniTest::SpecはRubyに標準添付されたBDDフレームワークです。
test-kitchenではminitest-chef-handlerによってMiniTest::Specによるテストが呼び出されて実行されます。
まず、Cookbookのfilesディレクトリに雛形を準備します。
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ mkdir -p files/default/tests/minitest/support
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi files/default/tests/minitest/support/helpers.rb
module Helpers
module Apache2Take
include MiniTest::Chef::Assertions
include MiniTest::Chef::Context
include MiniTest::Chef::Resources
end
end
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi files/default/tests/minitest/default_test.rb
require File.expand_path('../support/helpers', __FILE__)
describe 'apache2-take::default' do
include Helpers::Apache2Take
end
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$
Apache2Takeやapache2-takeの箇所は対象のCookbookの名前に適宜置き換えてください。
ここから実際のテストケースを組み込んでいきます。どのような記述が可能かはminitest-chef-handler/examplesが参考になるでしょう。
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$ vi files/default/tests/minitest/default_test.rb
require File.expand_path('../support/helpers', __FILE__)
describe 'apache2-take::default' do
include Helpers::Apache2Take
%w{ apache2 git-core curl unzip }.each do |s|
it "installs #{s}" do
package( s ).must_be_installed
end
end
%w{ /etc/apache2/ports.conf /etc/apache2/sites-available/default }.each do |s|
it "exists #{s}" do
file( s ).must_exist
end
end
it 'boots on startup' do
service( 'apache2' ).must_be_enabled
end
it 'creates /var/www/index.html' do
file( '/var/www/index.html' ).must_exist
end
it 'creates /var/www/img' do
directory( '/var/www/img' ).must_exist
end
it 'runs as a daemon' do
service( 'apache2' ).must_be_running
end
end
ubuntu@kitchen:~/chef-repo/cookbooks/apache2-take$
このように自然言語に近い形で記載します。
これでbundle exec kitchen testしてみましょう。
: [2013-04-11T02:17:19+00:00] INFO: Chef Run complete in 92.08716571 seconds [2013-04-11T02:17:19+00:00] INFO: Running report handlers Run options: -v --seed 62759 # Running tests: apache2-take::default#test_0007_boots_on_startup = 0.04 s = . apache2-take::default#test_0009_creates_var_www_img = 0.00 s = . apache2-take::default#test_0006_exists_etc_apache2_sites_available_default = 0.00 s = . apache2-take::default#test_0003_installs_curl = 0.03 s = . apache2-take::default#test_0005_exists_etc_apache2_ports_conf = 0.00 s = . apache2-take::default#test_0008_creates_var_www_index_html = 0.00 s = . apache2-take::default#test_0010_runs_as_a_daemon = 0.05 s = . apache2-take::default#test_0004_installs_unzip = 0.03 s = . apache2-take::default#test_0002_installs_git_core = 0.03 s = . apache2-take::default#test_0001_installs_apache2 = 0.03 s = . minitesthandler::default#test_0001_runs_no_tests = 0.00 s = . Finished tests in 0.206606s, 53.2416 tests/s, 48.4014 assertions/s. 11 tests, 10 assertions, 0 failures, 0 errors, 0 skips [2013-04-11T02:17:19+00:00] INFO: Report handlers complete
このようにテストが実行されました。
test-kitchenはMiniTest::SpecだけでなくCucmberを利用したテストが可能で、他にもテストを行う上でのさまざまな設定が可能です。詳細はtest-kitchen/README.mdを参照してください。