私はrandom.nextDouble()を使用するクラスをテストする必要があります。実行された出力を予知できるように、これらの数値をテストに提供するエレガントな方法はありますか?ランダムな値を使用するクラスをテストする
答えて
乱数ジェネレータを別のコンポーネントに埋め込み、クラスに注入することをおすすめします。このようにして、模擬インスタンスをテストに注入することができます。それは私の意見で最もエレガントなソリューションです。リフレクションを使っていくつかのトリックを行い、クラス本体内で作成されたランダムジェネレータをオーバーライドすることもできますが、これはまったくお勧めできません。
+1:RNGを播種しても(@ Adamの答え)、IMOは隠れた状態を避けるため、より洗練されたソリューションです。 –
はい、あります:シードされた乱数を使用します。
クラスにプライベートコンストラクタを追加して、そのクラスがランダムにシードを取るようにする必要があります。代わりに
random = new Random();
を書くのコンストラクタでは、プライベートフィールドrandom
を初期化するために
random = new Random(seed);
を書きます。 creating a Random with a seedによって、ランダムの内部状態をシードから初期化します。 Randomは実際にはランダムではなく、次の戻り値を現在の状態に基づいた擬似乱数ジェネレータであるため、初期状態を設定することにより、一連の呼び出しによって返される数値のシーケンスをランダムに設定します。
デフォルトのコンストラクタではなく、この特別なパッケージプライベートテストコンストラクタを使用して、タイプFoo
の新しいオブジェクトを初期化します。テストするクラスが同じシードを渡すたびに同じシードを渡す限り毎回擬似乱数列を生成します。
あなたのテストは何を証明しようとしていますか?そのnextDouble
は実際に特定の値を返しますか?それは私にとって非常に有用なテストのようには見えません。
あなたがこの種の状況でできることは、あなたのコードを何回も実行すると、毎回違う乱数が得られることを証明することです。 1000のループでそれを実行し、何らかの種類の結果をSet
に格納します。次に、Set
のサイズがループを繰り返した回数と同じであることをアサートします。
これよりもうまくいくには、「ランダム」が意味するものを正確に数値化する必要があります。全体の本はこれに書かれており、単体テストで試してやるのは本当に有用なことではありません。
なぜ(受理)確率的アルゴリズムが有用でないかをテストしていますか? – DaveFar
私はあなたに尋ねられてうれしいです。 JUnitなどの自動化テストのポイントの1つは、非常に頻繁に実行でき、ソフトウェアが仕様に準拠していればテストが合格するということです。一連の乱数(例えば、少なくとも40%は許可された範囲の半分に収まる必要があります)に合致する条件は、合法的に失敗する可能性があります。実際には、プログラムが正常に動作する場合は失敗する必要があります。したがって、実行するたびにJUnitテストをパスしたい場合、JUnitテストで「これらの数値はランダムです」と表現する方法はありません。もちろん、数字が生成されたことをテストすることができます... –
...( 'random.nextDouble'のような)特定のアルゴリズムによって、システムのビジネス要件を反映することはできません。したがって、あなたがテストしているものであってはなりません。唯一合理的なことは、 'Random'の周りにラッパーを置き、ラッパーをスタブし、生成された後に正しいことが乱数に起こっていることをテストすることです。 –
- 1. Selenium + Appiumとjavaを使用してランダム値をテストする方法
- 2. 配列からランダムなクラスを選択して使用する
- 3. エリクシルのランダムな値の衝突をテストする
- 4. ランダムな値にスピンするイメージを作るランダムな値を加算する
- 5. ランダムな結果から同じ値を使用する
- 6. ランダムlongを使用してランダムなdoubleを生成する
- 7. ユニットRegistryManagerを使用するクラスをテストするC#Azure IoTHub
- 8. Razor - ランダムなCSSクラスを配列から適用する
- 9. ランダムな値を出力するC++プログラム
- 10. SOAPUIでランダムな値を追加してアサートする残りのテスト
- 11. ランダムなクラスのオブジェクトを作成するか、乱数を生成するためにMath.random()を使用する
- 12. カピバラの統合テストでランダムなデータを使用すべきですか?
- 13. phpunitがランダムにテストを再開する
- 14. このクラスにランダムな値を取得する方法はありますか?
- 15. javascriptを使用してランダムなid値を表示する方法
- 16. Moqを使用して抽象クラスをテストする
- 17. EasyMockを使用して内部クラスをテストする方法
- 18. Mockitoを使用して抽象クラスをテストする
- 19. Guava MapInterfaceTestを使用してクラスをテストする方法
- 20. XMLデータベースを使用してJavaクラスをテストする
- 21. javascript配列内の同じランダム値を使用する方法
- 22. ランダムな値を返すNSTimeInterval
- 23. ピカソを使用するとランダムな画像が回転する
- 24. クラスの拡張で静的な値を使用する
- 25. スカラ値クラスを使用する符号なし変数
- 26. jQueryを使用してクラス値を使用してId値を取得する
- 27. デコレータ内でテスト用のパラメータをランダム化するコール関数
- 28. 基底クラスの派生クラス値を使用する
- 29. ランダムでng-repeatを使用する
- 30. ランダム演算子を使用する
モックRNGを注入しますか? –
RNGシードを制御しますか? – trutheality