私は PHPUnit を使用しており、私の伝統的なアプローチは、テストしているメソッドによって呼び出されるモック オブジェクトとメソッドを使用することです。モック オブジェクトは、単体テストによって入力として何を期待するかを伝えられます。問題は、モック オブジェクトに提供される入力の一部が、テスト対象のメソッドによってランダムに生成されることです (単体テストでは、それらが何であるかを知る方法がありません)。
誰かが解決策を提案できるかどうか疑問に思っています。
私は PHPUnit を使用しており、私の伝統的なアプローチは、テストしているメソッドによって呼び出されるモック オブジェクトとメソッドを使用することです。モック オブジェクトは、単体テストによって入力として何を期待するかを伝えられます。問題は、モック オブジェクトに提供される入力の一部が、テスト対象のメソッドによってランダムに生成されることです (単体テストでは、それらが何であるかを知る方法がありません)。
誰かが解決策を提案できるかどうか疑問に思っています。
特定のケースを知らずに判断するのは難しいですが、テスト対象のオブジェクトに乱数プロバイダーを挿入するようにリファクタリングできるかもしれません。テスト中に、ハードコーディングされた乱数シードを使用して、再現可能な結果を得ることができます。
期待される結果のマップがあり、キー セットからランダムに描画する場合、ある程度のランダム性を持たせても、期待される結果を予測することができます。
「ランダム部分」をメソッドに注入できますか (または、ランダム性がコア機能ですか)?
たとえば(「ランダム」を文字通りに取った単純化された例かもしれません)代わりに
function foo($x, $y) {
return $x * rand(1, $y);
}
のようなものを使用します
function foo($x, $r) {
return $x * $r->getNext();
}
このようにして、実際にはランダムな値を返さない $r のオブジェクトを渡すことができるため、テストで可能な限り多くの「ランダム性」を排除しますが、エッジ ケースなどです。
私は常に単体テストを反復可能なものと考えています。(つまり、各実行は同じように動作し、同じ結果が得られます)。
単体テストには他にも前提条件がありますが、私にとっては最も重要なものです。(この非常に優れた定義を見てください)
これを考えると、特定のケースをテストすることは不可能に見えるかもしれません.
あなたのコードのランダムなものを特定の部分に分けようとします。次に、それをデータ ソースと見なして、モックも作成します。
これをあなたの文脈に適用できることを願っています。
入力に関して厳密なモックを使用する必要はありません。テストに価値を追加する場合にのみ使用してください。
他のシナリオでは、入力を気にしないスタブを使用するか、必要に応じていくつかのメソッドを厳密にし、いくつかのメソッドを緩くします。