0

サーバー上のRAMの量がプロパティファイルにリストされているマウント以上かどうかを確認することを目的としたserverspecテストを作成しました

   describe command('perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo') do
     its(:stdout){ should be >= "#{property['ram']}"}
    end

コマンドでテストしているマシンでは、「7539944」が得られます

プロパティ ram が "888" に設定されている場合、文字列比較 "888" が "7539944" より大きいため、テストは誤って失敗します。

serverspec の文字列型で数値比較を行う方法はありますか?

このirbセッションは、Rubyがどのように動作していると信じているか、どのように動作させたいかを示しています

$ irb
1.9.3-p484 :001 > prop="888"
 => "888" 
1.9.3-p484 :002 > command="7539944"
 => "7539944" 
1.9.3-p484 :003 > command > prop
 => false 
1.9.3-p484 :004 > command.to_i > prop.to_i
 => true 

説明をこれに変更すると

describe command('perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo') do
 its(:stdout){ should be >= "#{property['ram']}".to_i}
end

このエラーが発生します

Failures:

      1) std Command "perl -n -e "if (/MemTotal:\s+(\d+)/) { print \$1; last; }" /proc/meminfo" stdout should be >= 888
         On host `foo.bar.org'
         Failure/Error: its(:stdout){ should be >= "#{property['ram']}".to_i}
         ArgumentError:
           comparison of String with 888 failed
           sudo -p 'Password: ' /bin/sh -c perl\ -n\ -e\ \"if\ \(/MemTotal:\\s\+\(\\d\+\)/\)\ \{\ print\ \\\$1\;\ last\;\ \}\"\ /proc/meminfo
           7539944
         Shared Example Group: "ram::init" called from ./spec/std/spec.rb:5
         # ./spec/shared/ram/init.rb:4:in `block (3 levels) in <top (required)>'
4

1 に答える 1

2

このツールは古き良きものを超えて実行されrspecます。このタスクを実行するのに DSL は必要ありません。

context 'memory' do
  it "should be greater than #{888}" do
    expect(`cat /proc/meminfo`[/MemTotal:\s+(\d+)/, 1].to_i).to be >= 888 
  end 
end

Ruby からの Perl の呼び出しで、私の一日が終わりました。

UPD私は少し遊んでみましたserverspecが、あなたの要件の直接的な実装を見つけることができませんでした. Stringしたがって、そのようにモンキーパッチを適用することをお勧めします。

class String
  def greater_than? other
    to_i > other.to_i rescue false
  end
end

そうすれば、シナリオに次のように書くことができます。

its(:stdout) { should be_greater_than "#{property['ram']}" }

それが役に立てば幸い。

于 2015-10-30T13:07:06.537 に答える