fbpx

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$

Apache2Takeapache2-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を参照してください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA