Techioz Blog

Ruby Test::Unit テスト クラス内の複数のアサーションが最初の失敗時にスキップされる

概要

いくつかの関連する質問とその回答を見ましたが、私の問題を完全に解決できるものはないようです。

私の単体テストは通常、拡張とメンテナンスを容易にするために外部データセットによるデータ駆動型です。あらゆる種類の入力を使用してプリミティブをテストします。例として、(Ruby の通常のルールではなく) 特定のルールに従って引数を評価する #truthify メソッドがあります。テスト入力のセットは拡大し続けています。

したがって、2 つのテスト クラスがあり、1 つは「true」引数が正しく評価されるかどうかをテストするためのもので、もう 1 つは「false」引数用です。各クラスは入力セットを反復処理し、ループ内でアサーションを作成します。ただし、最初に失敗すると、そのテスト クラスの処理が中止されます。

これは私の最も単純な例の 1 つです。

私が最後に Test::Unit (数年前) を使用したとき、ISTR には、テスト クラスを中止せずに、失敗した各アサーションを報告させる方法がありました。

テスト値ごとに個別のテスト クラスを作成することは、たとえサブクラス化で物事を単純化したとしても、あまりにも扱いにくく保守不可能であり、KISS と DRY にも違反していると感じます。

アサーションが失敗した後に Test::Unit に続行するように指示する方法がない場合、テスト ケース内のテスト クラスのリストを動的に変更する方法はありますか?そうすれば、少なくともケースの初期化で、外部データセットの値に基づいて個々のテスト クラスをすべて動的に追加できます。

解決策

各アサーションは独自のテスト メソッド内に存在する必要があります。

class MyTest < Test::Unit::TestCase
  10.times do |i|
    define_method "test_#{i}" do
      assert false, "Assertion was false."
    end
  end
end
10 tests, 10 assertions, 10 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed

必要に応じて、選択的にファイルを要求できます。

# test/run.rb

require "test/unit"

# require whatever tests you want to run
require_relative "./my_test"

Test::Unit::AutoRunner.run

またはコマンドラインからの正規表現テストクラス:

$ ruby test/run.rb --testcase=/myte/i