GeekBox

IT系エンジニアの雑記

【Serverspec】リソースタイプcommandで返却値が空になる場合の対処法

スポンサーリンク

例としてjavaのバージョンをチェックするテストを以下のように実行しようとした場合。

describe command("java -version") do
  its(:stdout) { should match /java version "1.7/ }
end

以下の結果になり、期待値(expected)が""と空になっている。

 
Failures:
 
  1) Command "java -version" stdout should match /java version "1.7/
     On host `hoge'
     Failure/Error: its(:stdout) { should match /java version "1.7/ }
       expected "" to match /java version "1.7/
       sudo -p 'Password: ' env PATH="/sbin:/usr/local/sbin:$PATH" /bin/sh -c java\ -version

結論

java -versionコマンドの出力結果が標準出力(stdout)ではなく標準エラー(stderr)に出力されているため、its(:stdout)では出力を取得できないから。

なぜ標準出力ではなく、標準エラーへ出力されるのかは謎。 一応調べてみたけどそういう仕様っぽく、nginxとかも同様らしい。 という事なので回避するには以下のどちらかで対処する感じになりそう。

1.全ての出力を標準出力へ出す

describe command("java -version 2>&1") do
  its(:stdout) { should match 'java version "1.7.0_131"' }
end

2.stdoutではなくstderrでテストを行う

describe command("java -version") do
  its(:stderr) { should match /java version "1.7.0_131"/ }
end

java -versionの仕様として「stderr」へ出力を行うのであれば「stderr」でテストするのが正しいような気もするが、 テストケースをパッと見たときに 「stderr」 と書いてあると混乱しそうな気もする。。。