serverspecを書いてみた

ここら辺を調べてるときにチラチラと見かけたserverspecが気になっていたので調べてみました。serverspec - Homeはサーバの状態・設定をテストするためのプロダクト、のようです。なので、Railsチュートリアル環境に対してのテストを書いてみたいと思います。

serverspecのインストール

serverspecはgemで提供されているので、まずはホームディレクトリにGemfileを作成します。

// ~/Gemfile
source 'https://rubygems.org'
gem "serverspec", "1.0.0"

続いてインストール。

C:\Users\m-namiki>bundle install
Using diff-lcs 1.2.5
Using highline 1.6.21
Using net-ssh 2.8.0
Using rspec-core 2.14.8
Using rspec-expectations 2.14.5
Using rspec-mocks 2.14.6
Using rspec 2.14.1
Using specinfra 1.0.1
Using serverspec 1.0.0
Using bundler 1.6.0
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

無事インストールされたので、Railsチュートリアル環境のディレクトリで初期設定を行います。

C:\Users\m-namiki>cd vagrant\rails3-tutorial
C:\Users\m-namiki\vagrant\rails3-tutorial>serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: y
Auto-configure Vagrant from Vagrantfile? y/n: y
 + spec/
 + spec/default/
 + spec/default/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

テストコードを書く

Rakefileを見るとspec/以下にある*_spec.rbを実行対象とするようです。なので、デフォルトで作られるhttpd_spec.rbは削除して、新たにbase_spec.rbを書きます。

require 'spec_helper'

describe yumrepo('epel') do
  it { should exist }
  it { should be_enabled }
end

describe yumrepo('remi') do
  it { should exist }
  it { should be_enabled }
end

yumリポジトリにepelとremiが存在するかどうかのテストケースを作成してみました。上記でyumrepoと書いてある部分をResourceTypeといい、他にpackageとかserviceとか色々あるようです。詳細はserverspec - Resource Typesに記載されているので、後々確認してみます。

テスト実行

テストケースが完成したのでさっそく実行。

C:\Users\m-namiki\vagrant\rails3-tutorial>rake spec
C:/Ruby193/bin/ruby.exe -S rspec spec/default/base_spec.rb
Unable to find ~/.rspec because the HOME environment variable is not set
FFFF

Failures:

  1) Yumrepo "epel"
     Failure/Error: Unable to find matching line from backtrace
     ArgumentError: non-absolute home

       non-absolute home

(中略)

Finished in 0.002 seconds
4 examples, 4 failures

Failed examples:

rspec ./spec/default/base_spec.rb:4 # Yumrepo "epel"
rspec ./spec/default/base_spec.rb:5 # Yumrepo "epel"
rspec ./spec/default/base_spec.rb:9 # Yumrepo "remi"
rspec ./spec/default/base_spec.rb:10 # Yumrepo "remi"
C:/Ruby193/bin/ruby.exe -S rspec spec/default/base_spec.rb failed

見事に失敗。メッセージを読むと環境変数HOMEがないから.rspecが見つからないよと言われてるようです。なので確認してみます。

C:\Users\m-namiki\vagrant\rails3-tutorial>set HOME
HOME=%USERPROFILE%
HOMEDRIVE=C:
HOMEPATH=\Users\m-namiki
C:\Users\m-namiki\vagrant\rails3-tutorial>set USERPROFILE
USERPROFILE=C:\Users\m-namiki

環境変数HOMEは設定されていますが、Windows的な何かじゃないのかもしれない。。。なのでRakefileに定義してみました。

require 'rake'
require 'rspec/core/rake_task'

# ここにHOMEを追記
ENV['HOME'] = 'C:\Users\m-namiki'

RSpec::Core::RakeTask.new(:spec) do |t|
  t.pattern = 'spec/*/*_spec.rb'
end

task :default => :spec

で、改めて実行してみると

C:\Users\m-namiki\vagrant\rails3-tutorial>rake spec
C:/Ruby193/bin/ruby.exe -S rspec spec/default/base_spec.rb
....

Finished in 25.05 seconds
4 examples, 0 failures

今度は無事に成功しました。まだ簡単なテストしか書いていないので次はもうちょっと色々なケースを追加してみようと思います。