Techioz Blog

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

また、バージョン管理の差分を調整する必要がある場合に、バージョン管理の差分が読みやすくなります。