3

たとえば、次のテストがあります。

    [Test]
    public void MyTest( [RandomNumbers( Count=100, Minimum=0, Maximum=1000 )] int number )
    {
        ...
    }

そして、ある時点で、私の通常のビルドプロセス中に失敗しました。電子メールの通知を受け取り、調査に取り掛かりました。

ここで、Visual Studioでテストを開き、[テストの実行]をクリックすると、合格します。私はそれをもう一度やります、そしてそれは再び通過します。そしてまた。そしてまた。明らかに、失敗はその特定の乱数シーケンスに関連していました。

したがって、問題は次のとおりです。その正確なシーケンスでこのテストを再実行するにはどうすればよいですか?
(ガリオの完全なレポートがある場合)

 
 
更新:(
それが悪い考えであるというコメントに続いて)

まず、私は実際にそれが良い考えであるかどうかを尋ねていません。質問は異なります。

第2に、テスト対象のシステムが十分に複雑で、入力データスペースが複数の独立した次元である場合、そのスペースを同等の領域に適切に分割することは、精神的な努力と時間の両方で重大な課題を提示します。システムの一部は、すでに独自にテストされています。同時に、あちこちでシステムを突くことができたら、そうしてみませんか?

第三に、私は実際にはこの分野の初心者ではありません。私は常にこの手法を他のテストフレームワーク(csUnitやNUnitなど)で使用しましたが、微妙なバグを見つけるのに非常に成功しました。当時、生成されたデータなどの概念はなかったのでSystem.Random、あらかじめ決められたシードの形で独自のカスタム松葉杖を使用しました。そのシードは、フィクスチャの初期化の一部として(通常は現在の時刻に基づいて)生成され、ログに注意深く書き込まれていました。このようにして、テストが失敗したときに、ログからシードを取得し、それをテストフィクスチャに接続して、まったく同じテストデータのセットを取得できるため、デバッグにまったく同じ失敗が発生します。

そして第四に、それがそのような悪い考えであるならば、なぜRandomNumbers工場はそもそも存在するのですか?

4

1 に答える 1

1

現在、Gallio / MbUnitには、同じ乱数シーケンスを再度生成するための組み込みの方法はありません。しかし、これは便利な機能である可能性があると思います。私はそのリクエストに対して問題を開きました。準備ができたら、件名の回答を更新します。

私が提案するのは次のとおりです。

  • 内部ランダムジェネレータの実際のシードを注釈としてテストレポートに表示します。
  • Seedプロパティを[RandomNumbers]と属性に公開[RandomStrings]し、流暢なデータジェネレータにも公開します。

したがって、ジェネレータに同じシード番号を供給することで、まったく同じ値のシーケンスを簡単に再生成できます。

更新:この機能はGalliov3.3.8以降で利用できるようになりました。


今、私たちは皆、ペテルが言ったことに同意します。単体テストの入力として乱数を使用することは、めったに良い考えではありません。当然の結果として、それは時々便利でほとんど適切であるということです。そしてそれこそが、MbUnitにその機能を実装することを決定した理由です。IMHO、ランダムなテスト入力にうまく適合する可能性のある一般的なシナリオは、ハッシュコード計算の確率的分析です。

于 2010-09-18T11:38:05.593 に答える