Ruby
chef
serverspec

Chef等でアプリケーションのテストでは使わないファイルを生成したときのServerspec

More than 1 year has passed since last update.


文法チェックをしておく

アプリケーションコードのテストと Chef によるサーバ構築で共通化されないファイルがある場合、そのファイルの文法をミスしても「アプリケーションのテストで気づく」ことができない場合があります。

そこでテストでは最低限、言語の文法通りにファイルが作られていることは確認しておきます。

(Ruby の場合)


sample_spec.rb

  describe command("ruby -c sample.rb") do

its(:stdout) { should match /Syntax OK/ }
its(:stderr) { should be_empty }
end

PHP であれば、 php -l file_name を使いましょう

チェックの意味でいうと stdout だけで充分ですが、stderr should be_empty としておけば、 fail したときに stderr の内容をテストの出力で見ることができるので便利です。


デフォルトにダミー値を入れておき、それが上書きされているかチェックしておく

たとえば構築したサーバで使うメールアドレスや外部ドメインを設定値として持ち、環境ごとにその値を変えるということがあると思います。

その場合は


  • attributes/default.rb で値の置き場所を確保しつつ

  • environments などでその attribute を override

といったことをすると思いますが、万が一 environments でキーを間違えてしまった場合に、想定した値を埋め込むことができなくなってしまいます。(未定義のキーに対する値を指定したとしても、何もエラーが出ないので。)

そこで、テスト時にそのようなミスを検出できるような書き方をします。

attributes のデフォルト値にはそれがダミーの値だということが分かる値を入れておいて、environments などでそれが上書きされ、ダミーの値がなくなっていることを確認します。


attributes/default.rb

default[:sample_domain] = 'example.com'



sample.erb

<%= node[:sample_domain] %>



sample_spec.rb

  describe file("sample.erb") do

its(:content) { should_not match /example\.com/ }
end

こうしておくと、仮に


sample.json

{

"sample_domain___": "xxxx.com"
}

としてしまったときに、テストが fail するので気づきます。

※ダミーのドメインとしては、 example.com を使わないほうが良いですが、ここはあくまで例ということで。