Ruby でスクリプト全体をテストする
概要
スクリプト全体をテストする最良の方法は何ですか?スクリプトが正しい結果を返す (出力する) かどうかをテストしたいと考えています。これまでのところ、私が持っているのは、多かれ少なかれ次のことを行う別のスクリプトです。
#テスト.rb
expected = 'test'
output = `script.rb --many params`
if output != expected
puts "Error"
end
この例では、テストするスクリプトの名前は script.rb です。 乾杯。
解決策
test-unit を使用すると、次のようなコードになります。
class TestScript < Test::Unit::TestCase
def test_output
assert_equal 'test', `script --options`
end
end
プログラムからの出力を処理する場合、処理方法をより詳細に制御できるため、open3 ライブラリを使用することをお勧めします。同様に、assert_output_equal のような独自のラッパーを作成することもできます。
def assert_output_equal(output, command, message = nil, &block)
Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
assert_equal output, stdout.read, message, &block
end
end
これにプロセスのステータスをテストして、プロセスが成功したこと、STDERR などに出力がないことを確認することもできます。
大量のテキスト出力 (JSON データ、フォーマットされたリストなど) を生成するものをテストする場合は、ソースでテキストを定義するのではなく、test/expect のような場所にファイルを作成し、そのファイルを出力と比較するのが最善であることがわかりました。 。これにより、最初にファイルを簡単に作成できるようになります。
old_script > test/expected/old_script.default
old_script --option > test/expected/old_script.with-option
また、バージョン管理の差分を調整する必要がある場合に、バージョン管理の差分が読みやすくなります。