FsCheckを試してみる時間だと思っていましたが、思っていた以上に厳しいものになりました。 Arb
、ジェネレータなどに関する多くのドキュメントがありますが、その知識をどのように適用するかについてのガイダンスはないようです。または私はそれを得ていないだけです。プロパティベースのテストの入力としてFsCheckを使用して乱数を生成する方法
テスト、プロパティ、ジェネレータ、仲裁人、縮小、そして私の場合はランダム性(いくつかのテストでは自動的にランダムなデータが生成されますが、他のものではありません) 。私はハスケルのバックグラウンドを持っていないので、あまり役に立たない。
質問:乱数を生成するにはどうすればよいですか?
私のテストシナリオはのは、分配性を言わせて、掛け算の性質に説明することができます。
static member ``Multiplication is distributive`` (x: int64) y z =
let res1 = x * (y + z)
let res2 = x * y + x * z
res1 = res2
// run it:
[<Test>]
static member FsCheckAsUnitTest() =
Check.One({ Config.VerboseThrowOnFailure with MaxTest = 1000 }, ``Multiplication is distributive``)
私はCheck.Verbose
またはNUnitの統合でこれを実行すると、私は次のようにテストシーケンスを取得:
0:
(-1L, -1L, -1L)
1:
(-1L, -1L, 0L)
2:
(-1L, -1L, -1L)
3:
(-1L, -1L, -1L)
4:
(-1L, 0L, -1L)
5:
(1L, 0L, 2L)
6:
(-2L, 0L, -1L)
7:
(-2L, -1L, -1L)
8:
(1L, 1L, -2L)
9:
(-2L, 2L, -2L)
1000テスト後に100L
を獲得していません。どういうわけか私はint64
の全範囲に均等に分布した乱数を「自動的に」選択すると想像しました。
ことがないので、私は実験を始めと高い数値を取得するには、以下のような愚かな解決策を思い付いた:
type Generators =
static member arbMyRecord =
Arb.generate<int64>
|> Gen.where ((<) 1000L)
|> Gen.three
|> Arb.fromGen
をしかし、これは信じられないほど遅くなり、明確に正しいアプローチではありません。私は欠けている簡単な解決策がなければならないと確信しています。私はGen.choose(Int64.MinValue, Int64.MaxValue)
で試してみましたが、これはintsをサポートしていますが、longsではなく(ちょうどintであっても動作させることはできませんでした)。
最後に、すべての基本数値データ型(その最大値と最小値、ゼロと1を含む)、およびその中の何らかのランダム選択を含むソリューションが必要です。
私はそれが最初に最大値を制限すると思います。 〜100、参照してください:[fscheck Q](http://stackoverflow.com/questions/40591229/fscheck-doesnt-generate-random-enough-data/) – s952163
@ s952163、はい、私は 'MaxTest = 1000 '、上記のコードを参照してください。しかし、それは役に立たない。おそらく、あなたは 'StartTest'と' EndTest'の値を意味するでしょうが、これらを 'Int32.MinValue/MaxValue'に設定すると、すべての順列が' Int32.MinValue'を定数として使うという効果があります。 – Abel