Serverspecでテスト項目に変数を使う方法

こんにちは!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'18end19end20end

spec/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
  1. 実行します。
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
  1. 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でテストしてしまい失敗となります。

いかがでしたか。

数値だけを変数として扱うことで、コードを変更せずにスペックの違いをテストすることができます。

次回もお楽しみに!!

この記事を書いた人

aws-recipe-user