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