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