私は当初、最初の 5 つの要素が修正されたジェネレーターを作成しようとしましたが (Prop.forAll
最初の 5 つを使用するテストでは常に実行されます)、失敗しました。
現在、範囲内のランダムデータ用に1つのジェネレーターと、非ランダムデータ用に1つのジェネレーター、つまり固定シーケンスを使用することで、これを簡素化しようとしています。に似てGen.constant
いますが、1 つの値ではなく一連の値である点が異なります。
私はこれを持っています(単純化された再現可能な例、NUnitとxUnitで動作します):
[<Property(Verbose = true, MaxTest=5)>]
static member MultiplyIdentityCornerCases () =
Gen.elements [0L; -1L; 1L; Int64.MinValue; Int64.MaxValue]
|> Arb.fromGen
|> Prop.forAll <| fun x -> x = x * 1L
出力は次のとおりです(どこからnull
来たのかわかりません):
0:
<null>
9223372036854775807L
1:
<null>
-9223372036854775807L
2:
<null>
-9223372036854775807L
3:
<null>
1L
4:
<null>
-9223372036854775807L
Ok, passed 5 tests.
出力には、5 つのテストすべてを順番に、できれば順序どおりに含めたいと思います。testdata プロバイダーを使用して NUnit (または任意の単体テスト システム) でこれを実行できることはわかっていますが、FsCheck で実行できるかどうか (または、そうすべきかどうか、おそらくこれは悪い考えです) を考えています。
FsCheck を使用すると便利だと思います。関数の引数が複数ある状況では、与えられたコーナー ケースの引数のすべての組み合わせを徹底的にテストする必要があります。これは、testdata プロバイダーよりも FsCheck の方が簡単であることが期待されます。