読者です 読者をやめる 読者になる 読者になる

inifileを使ってServerspecのテストを書いてみる part2

今回は、inifileのインストール&テストの記述をしていきます。
GitHub - TwP/inifile: Native Ruby package for reading and writing INI files

インストール

インストールはいたって簡単で、gemパッケージを追加するだけです。
なので、Gemfileinifileを記述してインストールしましょう。

$ cat Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem "rake"
gem "serverspec"
gem "highline"
gem "inifile"

$ bundle install
...

$ bundle exec gem list | grep inifile
inifile (3.0.0)

テストの記述

ではテストを記述していきます。
今回は、php.iniに記述されたパラメータshort_open_tag = Offmysql.connect_timeout = 60を例に書いていきます。
早速、実際のコードを示します。

     1  require 'spec_helper'
     2  require 'inifile'
     3
     4  # パッケージがインストールされているか
     5  describe package('php') do
     6    it { should be_installed }
     7  end
     8
     9  # php.iniの設定は正しいか
    10  describe 'php.ini' do
    11    describe file('/etc/php.ini') do
    12      # ファイルは存在するか
    13      it { should be_file }
    14
    15      # 各パラメータの設定は正しいか
    16      it 'configures check' do
    17        conf = IniFile.new.parse(subject.content)
    18        expect(conf['PHP']['short_open_tag']).to eq 'Off'
    19        expect(conf['MySQL']['mysql.connect_timeout']).to eq 60
    20      end
    21    end
    22  end

ポイントを解説します。

point1:requireでinifileを呼び出す

2行目のrequire 'inifile'で、inifileモジュールを使えるようにします。

point2:expectを使ってセクション・キーのペアで設定値をテスト

15〜20行目が、テスト部分に該当します。
17行目で、php.ini構文解析した結果を変数confに格納しています。
18行目と19行目で各パラメータの値をテストしています。
例えば、expect(conf['PHP']['short_open_tag']).to eq 'Off'は、セクション[PHP]のキーshort_open_tagの値がOffであることを確認します。
実際のphp.iniファイルと照らし合わせてみると良いでしょう。
以下、抜粋。

$ cat modules/php/templates/etc/php.ini.erb
...
[PHP]
...
short_open_tag = Off
...
[MySQL]
...
mysql.connect_timeout = 60
...

今回示した部分以外のテストしたい場合も、同様に記述すればOKです。

テストしてみる

実際にテストするとこのような結果になります。
configures checkの部分がinifileを使ってテストした部分に該当します。
ちなみに、configures checkという表示は、テストコードの16行目でit 'configures check' doと記述した部分が該当します。

$ TARGET_HOST=WEB01 ASK_SUDO_PASSWORD=1 bundle exec rspec spec/WEB01/php_spec.rb
Enter sudo password:

Package "php"
  should be installed

php.ini
  File "/etc/php.ini"
    should be file
    configures check

Finished in 2 seconds (files took 2.99 seconds to load)
3 examples, 0 failures

こんな感じで、テストすることが可能です。
次回は、should matchを使ってテストを記述した場合との比較をしてみたいと思います。