こんにちは!beardです!
今回は、Serverspecでテスト項目に変数を使う方法をご紹介します。
前回の『 Serverspecでディスクサイズをテストする方法 』という記事で、ディスクの容量をServerspecでテストする方法をご紹介しましたが、このディスクの容量を変数で扱いたいと思います。
値をテスト項目ではなくサーバ情報のymlに書き、テスト項目のコードでそれを参照することによってわかりやすさが向上します。
1. テストする環境
前回のServerspecでディスクサイズをテストする方法と同じディレクトリ構成をそのまま使います。テスト対象のディスクサイズは8GBです。
ディレクトリ構成
1Serverspec2├Rakefile3├server.yml ←テスト対象の情報を記述。ここに変数を宣言4├spec5|└spec_helper.rb6└ common7 └disk_spec.rb ←ディスク容量のテスト内容。宣言された変数を使う。server.ymlの内容
154.64.138.205:2 :roles:3 - common4 :EBSsize: 8 ←変数をこのように宣言しますRakefileの内容
1require 'rake'2require 'rspec/core/rake_task'3require 'yaml'4require 'highline/import'56desc "Run serverspec to all hosts"7task :spec => 'serverspec:all'89namespace :serverspec do10 ENV['TARGET_HOST_YML'] = ask("Enter Servers.yml(full path): ") { |q| q.echo = true }11 properties = YAML.load_file(ENV['TARGET_HOST_YML']) ←ymlファイルをpropertiesとして読み込みます。12 task :all => properties.keys.map {|key| 'serverspec:' + key.split('.')[0] }13 properties.keys.each do |key|14 desc "Run serverspec to {key}"15 RSpec::Core::RakeTask.new(key.split('.')[0].to_sym) do |t|16 ENV['TARGET_HOST'] = key17 t.pattern = 'spec/{' + properties[key][:roles].join(',') + '}/*_spec.rb'18end19end20endspec/common/disk_spec.rbの内容
1require 'spec_helper'2targetsize = property[:EBSsize]*0.8 ←properties(=ymlファイル)の中のEBSsizeという変数を0.8倍してtargetsizeの変数に読み込みます。3describe command("a=`df -k |grep /dev/xv | awk '{printf (\"%4.0f\", $2/1024/1024)}'`; test $a -gt #{targetsize.round} ; echo $?") do ←targetsizeの小数点を丸めて整数にします。※testコマンドは少数を扱えないため4 it { should return_stdout /0/ }5end- 実行します。
1rake spec2Enter Servers.yml(full path): /etc/variableTestServerspec/server.yml3/usr/bin/ruby2.0 -S rspec spec/common/disk_spec.rb4.56Finished in 0.39249 seconds71 example, 0 failures- EBSsizeを100にしてもう一度実行します。
1rake spec2Enter Servers.yml(full path): /etc/variableTestServerspec/server.yml3/usr/bin/ruby2.0 -S rspec spec/common/disk_spec.rb4F56Failures:78 1) Command "a=`df -k |grep /dev/xv | awk '{printf ("%4.0f", $2/1024/1024)}'`; test $a -gt 80 ; echo $?" should return stdout /0/9 On host `54.64.138.205`10 Failure/Error: it { should return_stdout /0/ }11 a=`df -k |grep /dev/xv | awk '{printf ("%4.0f", $2/1024/1024)}'`; test $a -gt 80 ; echo $?12 11314 expected Command "a=`df -k |grep /dev/xv | awk '{printf ("%4.0f", $2/1024/1024)}'`; test $a -gt 80 ; echo $?" to return stdout /0/1516# ./spec/common/disk_spec.rb:7:in `block (2 levels) in <top (required)>'1718Finished in 0.39212 seconds191 example, 1 failure2021Failed examples:2223rspec ./spec/common/disk_spec.rb:7 # Command "a=`df -k |grep /dev/xv | awk '{printf ("%4.0f", $2/1024/1024)}'`; test $a -gt 80 ; echo $?" should return stdout /0/24/usr/bin/ruby2.0 -S rspec spec/common/disk_spec.rb failed ←実際のディスクサイズが8GBなので100*0.8GBでテストしてしまい失敗となります。いかがでしたか。
数値だけを変数として扱うことで、コードを変更せずにスペックの違いをテストすることができます。
次回もお楽しみに!!