8

Perl でさまざまな科学データ形式のパーサーを作成しました。parser_*.t最近、すべてのフォーマットとサブフォーマットのファイルを含むテスト スイートを追加しました。

もちろん、パーサーの API はまったく同じですが、解析のテストに使用されるサンプル ファイルから読み取られるデータが異なります。テスト ファイルを単純化するために、パーサー オブジェクトと期待されるデータを表すハッシュ構造を渡すサブルーチンを作成しました。のように見えます

my $parser = new MyApp::Parser($file);
test_nested_objects = ($parser, {
     property1 => "value",
     property2 => 123,
     subobject_accessor => {
         property3 => "foobar",
     }
}

サブルーチンtest_nested_objectsはハッシュをウォークスルーし、ハッシュで定義されたすべてのプロパティのテストを実行しsubobject_accessorますproperty3

ファイル全体で実行され、すべての*.tファイルに追加されたテストの数を確認しました。ここで、ジェネリック関数にいくつかのチェックを追加しましたが、すべての計画が間違っています。tests => 123*.t

プランにサブテストを認識させるにはどうすればよいですか? 私は次のことを達成したいと思います:

  • 進行状況を表示するために実行する前に与えられたテストの数
  • 合計数は自動的に増加します → サブを編集するときに手動で数を変更する必要はありません
  • プローブの実行時に表示されるサブ内の個々のテスト (サブ内のテストを非表示にして 0 または 1 だけを返すことは受け入れられません。解析されたデータの何が問題なのかを本当に知る必要があるためです)

ご理解いただけると幸いです。話が長くなって申し訳ありませんが、背景知識がないと理解できないだろうと思いました。

4

2 に答える 2

11

テスト計画の最近の傾向は、単純にそれを行わないことです。テスト ファイルの最後で、最後に到達したことを宣言します。

 done_testing();

テスト計画の多くの用途は、テスト スクリプトが完了したことを確認するためだけに存在します。適切な数のテストが表示された場合、スクリプトは最後まで実行したに違いありません。それは本当ではありませんが、便利で実行可能なフィクションです.

データ構造のサイズを測定するなど、テストの数を決定するためにいくつかの計算を行う必要がある場合は、それを行ってからplan後で呼び出します。

 use Test::More;  # don't declare the plan yet

 my $test_count = ...;

 plan tests => $test_count; 

ただし、大きな計画を立てる代わりに、テストをサブテストに分割できます。各サブテストは実行するテストの数だけを知る必要があり、スクリプトはサブテストの数だけを知る必要があります。

 subtest some_label => sub {
      plan tests => $n;
      ...
      };

テスト関数への各呼び出しは 1 つのテストであり、関数はサブテストを使用して、呼び出し元にあまり公開せずにやりたいことを実行します。

于 2011-11-02T12:53:12.653 に答える
0

フォーマットごとのサブテストの数がわかっている場合は、BEGINTest::More を使用する前に、ブロック内のテストの計算を行うことができます。

于 2011-11-02T12:34:50.520 に答える