如何对字符串进行数字比较
How to do numeric comparison on strings
我编写了一个 serverspec 测试,旨在检查服务器上的 ram 数量是否大于或等于属性文件中列出的装载量
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 session 显示了我认为 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)>'
这个工具用完了旧的 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
进行 monkeypatch:
class String
def greater_than? other
to_i > other.to_i rescue false
end
end
这样你就可以在你的场景中编写:
its(:stdout) { should be_greater_than "#{property['ram']}" }
希望对您有所帮助。
我编写了一个 serverspec 测试,旨在检查服务器上的 ram 数量是否大于或等于属性文件中列出的装载量
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 session 显示了我认为 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)>'
这个工具用完了旧的 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
进行 monkeypatch:
class String
def greater_than? other
to_i > other.to_i rescue false
end
end
这样你就可以在你的场景中编写:
its(:stdout) { should be_greater_than "#{property['ram']}" }
希望对您有所帮助。