2011-11-16 35 views
5

Fzでは、いくつかのフィールドを持つレコードがあります。FsCheckでは、負でないフィールドを持つテストレコードを生成する方法は?

 type myRecord = { a:float; b:float; c:float } 

このレコードを使用するいくつかのプロパティをテストするのにFsCheckを使用しています。

 let verify_this_property (r:myRecord) = myFunction(r) = (r.a * r.b)/r.c 

myFunctionの内部実装の制限により、フィールドa、b、cのそれぞれがnonに制限されたテストケースを作成するようにしたいと思います。負の浮動小数点数です。

これは、 myRecord用のジェネレータを作成する必要があると思われますが、これを行う方法の例は見つかりませんでした。

誰でもガイダンスを提供できますか?

+0

は慎重にあなたを持っています[このFsCheck Wikiページ](http://fscheck.codeplex.com/wikipage?title=Test%20Data%20Generators&referringTitle=Home)を読んでください。ジェネレータの作成と登録の方法の例があります。 – fmr

+2

@ fmr - はい私はすべてのFsCheck Wikiページを慎重に読みました。シンプルなジェネレータを書くためのステップが用意されていますが(私はあまり明確ではありません)、これを拡張してレコードのジェネレータを作成する方法を決定することはできません。 –

答えて

7

はこれを試してみてください。これは、同等の発電機です:

あなたのジェネレータを登録グローバルにしたくない場合は、forAllを使用することができます。

練習として残し縮小
Check.Quick (forAll Generators.arbMyRecord verify_this_property) 

;)

+0

""構成の意味はなんですか?私は以前それを見たことがない。 –

+2

@DavidH:それはアプリケーションスタイルに便利な、中置の 'map'です。 http://bugsquash.blogspot.com/2010/12/zipping-with-applicative-functors-in-f.html –

+0

@DavidH:もう少し説明してください。 –

3

あなたは、これはFsCheckは全て不適当テストエントリを破棄しなければならないので、テストの(略?)に遅い実行されてしまいますけれどもFsCheck conditional properties

let verify_this_property (r:myRecord) = 
    (r.a > 0.0 && r.b > 0.0 && r.c > 0.0) ==> lazy (myFunction r = (r.a * r.b) * r.c) 

を使用して、カスタムジェネレータを作成しないようにすることができます。

type Generators = 
    static member arbMyRecord = 
     fun (a,b,c) -> { myRecord.a = a; b = b; c = c } 
     <!> (Arb.generate<float> |> Gen.suchThat ((<) 0.) |> Gen.three) 
     |> Arb.fromGen 

Arb.register<Generators>() |> ignore 
Check.Quick verify_this_property 

<!>は応用的なスタイルのために有用中置map、次のとおりです。

関連する問題