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

## 概要

前回: 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