確率的挙動のプログラムをテストするためのベストプラクティスは何ですか?


14

研究開発の仕事をしていると、私は自分の行動にある程度のランダム性があるプログラムを書いていることがよくあります。例えば、私が遺伝的プログラミングで働いているとき、私はしばしば任意のランダムなソースコードを生成して実行するプログラムを書きます。

そのようなコードのテストに関する問題は、バグが頻繁に断続的に発生し、再現が非常に困難になる可能性があることです。これは、ランダムシードを同じ値に設定して実行を開始するだけではありません。

たとえば、コードはカーネルリングバッファからメッセージを読み取り、メッセージの内容を条件付きでジャンプします。当然、後で問題を再現しようとすると、リングバッファーの状態が変更されます。

この動作は機能ですが、予期しない方法で他のコードをトリガーする可能性があるため、多くの場合、単体テスト(または人間のテスター)が見つけられないバグを明らかにします。

この種のシステムをテストするためのベストプラクティスは確立されていますか?もしそうなら、いくつかの参照は非常に役立ちます。そうでない場合は、他の提案を歓迎します!


5
カーネルリングバッファーもモック化できませんか?あなたのコードの他のランダムな側面は?
ジョナサンマーレット

1
@JonathanMerlet可能性がありますが、問題は、デプロイされると、コードが実際のリングバッファー(実際には、実際のOS)にアクセスできることです。そのため、モックアップされたバージョンでのみテストする場合、これらのバグの発見を後まで延期するだけです。
ジョンDoucette

この問題は、プログラムのランダムな動作(これはランダムシードによって制御できるため)ではなく、この「カーネルリングバッファー」の特定の状態に関連しているように思えます。あなたの質問は、実際には「外部状態に依存するプログラムをどのようにテストするのですか」です。
AakashM

@AakashM、ええ、それはそれを表現するより良い方法です。具体的には、外部状態に確率的にアクセスまたは変更する外部状態を持つプログラム。
ジョンドゥーチェ

回答:


7

提案されているように、フックを追加して正確な状態を再作成すると便利です。また、システムをインストルメントして、その「シード」をダンプできるようにします(PRNGシード、カーネルリングバッファ、およびその他の非決定的入力のソースを含む場合)。

次に、真のランダム入力を使用してテストを実行し、以前に発見された興味深いケースで回帰スタイルを実行します。

カーネルにアクセスする特定のケースでは、どのような場合でもモックを作成することをお勧めします。モックを使用して、コンテナでは「空」と「満杯」、または「0、1、2 ^ n、2 ^ n + 1、多数」の精神で、実際に表示される可能性が低い同等クラスを強制します数えられるもの。次に、これまで考えていたケースを処理してテストしたことを知って、モックと本物でテストできます。

基本的に、私が提案しているのは、決定論的入力と非決定論的入力の混合であり、決定論的入力は、考えられるものと驚いたものの混合物です。


6

合理的な方法の1つは、テスト用の定数値を乱数ジェネレーターにシードすることです。これにより、確定的な動作が得られます。


1
この; または、prngを完全にモックアウトします
jk。

1
提案をありがとう!既に単体テストのためにこれを行っていますが、すべての可能なプログラムを手作業でテストすることはできません。
ジョンDoucette

2
しかし、この手段では、ランダム性が正しく動作するかどうかをテスト...できないこと
ルイ・リス

2

統計的検定が唯一の方法だと思います。乱数が統計テストによってランダム性について「テスト」されるように、ランダムな動作を使用するアルゴリズムである必要があります。

同じまたは異なる入力でアルゴリズムを複数回実行し、相互に比較します。このアプローチの問題は、テストの終了に必要な計算時間の大幅な増加です。


必ずしも、入力の小さな「スパン」セットを選択し、それらに対して複数回実行できるため、信頼性を確認するために必要な入力の数が少なくなる場合があります。この「スパニング」セットは、コードの分岐ごとに入力して、すべてのオブジェクトなど初期化する必要があります
ダニエルMoskovichを

2

私はこの分野の専門家ではありませんが、確率論的なプログラムテストに関連する科学的な資料があります。

テストクラスを簡単に作成できない場合は、#Euphoricが言ったように、統計テストを使用できます。Borning et al。従来のアプローチと統計的アプローチを比較してください。@Euphoricによって提案された統計的検定の一般化は、Whittakerによって議論されたものかもしれません。彼は、望ましい(あなたの場合は確率的)動作の確率モデルを作成し、このモデルから特定のテストケースを生成することを提案しました(彼の専用の論文を参照)。


ありがとう!とても助かります。学術機関以外の場合は、著者のGoogleコードリポジトリから論文のプレプリント版を入手できます。team4model.googlecode.com
John Doucette
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.