5

F# には、いくつかのフィールドを持つレコードがあります。

    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 のそれぞれが非負の浮動小数点数に制限されたテスト ケースを FsCheck に作成してもらいたいと考えています。

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

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

4

2 に答える 2

7

これを試して:

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

<!>infixmapで、アプリカティブ スタイルに役立ちます。これは同等のジェネレーターです。

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

ジェネレーターをグローバルに登録したくない場合は、次を使用できますforAll

Check.Quick (forAll Generators.arbMyRecord verify_this_property)

練習として左に縮小 ;)

于 2011-11-23T04:07:30.180 に答える
3

FsCheck条件付きプロパティを使用すると、カスタムジェネレータの作成を回避できます

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)

ただし、FsCheckは不適切なテストエントリをすべて破棄する必要があるため、これによりテストの実行が(実質的に?)遅くなります。

于 2011-11-17T11:01:58.303 に答える