最近はChefとかAnsibleで構築を自動化する際に Serverspec で試験することも多くなってきたけれど、ServerspecだとXMLのテストがしにくい。
リソースタイプに'file'があるが、 containでは評価が正規表現なので通常のファイルの中身を見る文には便利。
describe file('/etc/httpd/conf/httpd.conf') do
its(:content){ should match /ServerName www.example.jp/ }
end
しかしXML形式だとタグの中の複数の値(nameとvalueとか)を見なければいけないとなると、スペースとかが入ってきてやたら長大な正規表現を書くことになりそうで、いまひとつしっくりこない。
<property> <name>dfs.block.access.token.enable</name>
<value>true</value> <description> If "true", access tokens are used as capabilities for accessing datanodes. If "false", no access tokens are checked on accessing datanodes. </description> </property>
というわけで、なんとなくしっくり来る方法はないかと試行錯誤をしたところこんな形になった。
'file'リソースタイプのsubjectがファイルの本体のオブジェクトのようだったので、その中身をnokogiriに喰わせて、タグでまとめられるようにしてみた。
そして、今回はプロパティの中身をチェックしたかったのでプロパティごとに名前でヒットさせてその値をテストするようにしてみた。
content + 正規表現よりは読みやすいかと思うのでひとまずはこういう形にしている。
しかし、なんかもっといい方法はないんもんだろうか。。。