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