6

モジュールList::Genの更新に取り組んでいるときに、メソッドを追加することにしました。このメソッドは、ソースからランダムな要素->pick(num)のサイズのリストを返します。numこれをテストするためにsrand、乱数ジェネレーターをシードし、次の形式でいくつかのテストを行いました。

srand 1234;
is $src->pick(5)->str, '3 6 1 7 9';

そして、これはすべて、当時私が使用していた Windows マシンでうまく機能しました。しかし、プロジェクトを Mac ワークステーションに移したところ、すべてのランダム性テストが失敗しました。これは、同じランダム シードを使用しているにもかかわらず、rand異なる結果が生成されたためです。これは、rand().

問題は、これらの機能をテストするための最適なクロス プラットフォームの方法は何かということです。rand関数を自分の関数でオーバーロードする必要がありますか? rand予測可能な出力を生成する「テスト」モードを有効にするために使用する関数へのフックを組み込む必要がありますか? 他の方法はありますか?

モジュールの依存関係ツリーを小さく保とうとしているので、コア Perl テクニックを含む回答を希望します。

Test::RandomTest::MockRandomは CPAN の提案のようですが、これらのモジュールを使用した経験のある人はいますか?

4

4 に答える 4

2

どちらも使っていません。

Test::Random は、リリースされたコードではなく、テストでランダム性を使用しているように見えるため、より良い選択のようです。使い方がずっと簡単になるはずです。

Test::MockRandom モジュールは、rand() 関数が決定論的なシーケンスを返すように強制します。

于 2011-04-19T19:01:48.937 に答える
0

たぶん、ランダムな部分はテストには関係ありませんか?

合格したテストでは、次のことを確認できます。

  1. ->pick( X ) は X 個の要素を返しましたか?
  2. すべての X 要素は $src リストの一部ですか?
  3. 0、1 などのテスト...
  4. (たぶん?) 2 つの異なる srand シードが異なるリストを返すことをテストします

rand() を方程式から外そうとしているので、これは基本的にすでに行っていることです。ずっと行って、関数がブリキに書かれていることを実行することをテストすることもできます。

于 2011-04-20T10:43:41.120 に答える
0

いくつかのピックを実行して、すべてが同じものを返さないようにすることができます。結局のところ、それが関数の目的です。

于 2011-04-19T19:32:58.313 に答える