LoginSignup
10
10

More than 5 years have passed since last update.

Serverspecでインフラのテストコードを書いてみる

Last updated at Posted at 2014-09-14

概要

前回: VagrantにServerspecをインストール
http://qiita.com/wkodate/items/c25482b5ae0bb59088e5

前回はServerspecのセットアップを完了したので、今回は実際にテストコードを書いてみる

テストコードのひな形をインストール

serverspec-initコマンドでテストコードのひな形をダウンロードできる

OS typeはUNIXの1

Backend typeは、今回はテスト対象のサーバ上でテストを実行するので2。実際にはリモートから確認する機会のほうが多そう

$ serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 2

 + spec/
 + spec/localhost/
 + spec/localhost/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

Rakefileとspecディレクトリが作られた。

テストを記述するのはこの中の spec/localhost/http_spec.rb というファイル

$ cat spec/localhost/httpd_spec.rb
require 'spec_helper'

describe package('httpd') do
  it { should be_installed }
end

describe service('httpd') do
  it { should be_enabled   }
  it { should be_running   }
end

describe port(80) do
  it { should be_listening }
end

describe file('/etc/httpd/conf/httpd.conf') do
  it { should be_file }
  its(:content) { should match /ServerName localhost/ }
end
  • httpdパッケージがインストールされているか
  • httpdが起動しているか
  • 80番ポートがlistenになっているか
  • /etc/httpd/conf/httpd.confがファイルとして存在していて、その中身が ServerName localhost にマッチするか

についてのテストを書いているようです

テスト実行(失敗)

試しにこのままテストを実行してみる。httpdはインストールしていないので失敗するはず

$ rake spec
-bash: rake: command not found
# rakeのインストール
$ sudo gem install rake
Fetching: rake-10.3.2.gem (100%)
Successfully installed rake-10.3.2
Installing ri documentation for rake-10.3.2
/usr/lib/ruby/1.8/rdoc/rdoc.rb:280: warning: conflicting chdir during another chdir block
/usr/lib/ruby/1.8/rdoc/rdoc.rb:287: warning: conflicting chdir during another chdir block
Done installing documentation for rake after 2 seconds
1 gem installed
$ which rake
/usr/bin/rake
# テスト実行
$ rake spec
/usr/bin/ruby -S rspec spec/localhost/httpd_spec.rb
Ferror reading information on service httpd: No such file or directory
FFFFF

Failures:

  1) Package "httpd" should be installed
     On host ``
     Failure/Error: it { should be_installed }
       rpm -q httpd
       package httpd is not installed
       expected Package "httpd" to be installed
     # ./spec/localhost/httpd_spec.rb:4

  2) Service "httpd" should be enabled
     On host ``
     Failure/Error: it { should be_enabled   }
       chkconfig --list httpd | grep 3:on
       expected Service "httpd" to be enabled
     # ./spec/localhost/httpd_spec.rb:8

  3) Service "httpd" should be running
     On host ``
     Failure/Error: it { should be_running   }
       ps aux | grep -w -- httpd | grep -qv grep
       expected Service "httpd" to be running
     # ./spec/localhost/httpd_spec.rb:9

  4) Port "80" should be listening
     On host ``
     Failure/Error: it { should be_listening }
       netstat -tunl | grep -- :80\
       expected Port "80" to be listening
     # ./spec/localhost/httpd_spec.rb:13

  5) File "/etc/httpd/conf/httpd.conf" should be file
     On host ``
     Failure/Error: it { should be_file }
       test -f /etc/httpd/conf/httpd.conf
       expected file? to return true, got false
     # ./spec/localhost/httpd_spec.rb:17

  6) File "/etc/httpd/conf/httpd.conf" content should match /ServerName localhost/
     On host ``
     Failure/Error: its(:content) { should match /ServerName localhost/ }
       cat /etc/httpd/conf/httpd.conf 2> /dev/null || echo -n
       expected "" to match /ServerName localhost/
       Diff:
       @@ -1,2 +1,2 @@
       -/ServerName localhost/
       +""
     # ./spec/localhost/httpd_spec.rb:18

Finished in 0.09874 seconds
6 examples, 6 failures

Failed examples:

rspec ./spec/localhost/httpd_spec.rb:4 # Package "httpd" should be installed
rspec ./spec/localhost/httpd_spec.rb:8 # Service "httpd" should be enabled
rspec ./spec/localhost/httpd_spec.rb:9 # Service "httpd" should be running
rspec ./spec/localhost/httpd_spec.rb:13 # Port "80" should be listening
rspec ./spec/localhost/httpd_spec.rb:17 # File "/etc/httpd/conf/httpd.conf" should be file
rspec ./spec/localhost/httpd_spec.rb:18 # File "/etc/httpd/conf/httpd.conf" content should match /ServerName localhost/
/usr/bin/ruby -S rspec spec/localhost/httpd_spec.rb failed

無事にテストが実行されて失敗したようです

テストコードの修正

自分でテストコードを作ってみる。

spec/localhost/http_spec.rb を以下のように修正

$ cat spec/localhost/httpd_spec.rb
require 'spec_helper'

describe command('whoami') do
  it { should return_stdout 'vagrant'}
end

実行ユーザのアカウントを表示させるコマンドで標準出力としてvagrantが返ってくる、という簡単なテスト

テスト実行(成功)

では、再度テストを実行してみましょう

$ rake spec
/usr/bin/ruby -S rspec spec/localhost/httpd_spec.rb
.

Finished in 0.01918 seconds
1 example, 0 failures

無事テストが成功したようです

他に公式サイトにいろいろなテストの書き方の例が公式サイト書いてあった。実際にテストを書くときはココを見ながら書くことになりそう
http://serverspec.org/resource_types.html

参考

rakeのインストール
http://blog.carbonfive.com/2010/03/29/how-to-install-rails-on-centos-5-4/

RSpecの構文
http://www39.atwiki.jp/startruby/pages/23.html

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10