在FsCheck中,如何使用非负字段生成测试记录?

Dav*_*d H 5 f# fscheck

在F#中,我有几个字段的记录:

    type myRecord = { a:float; b:float; c:float }
Run Code Online (Sandbox Code Playgroud)

我正在使用FsCheck来测试一些使用此记录的属性.对于(一个人为的)例子,

    let verify_this_property (r:myRecord) = myFunction(r) = (r.a * r.b) / r.c
Run Code Online (Sandbox Code Playgroud)

由于myFunction的内部实现限制,我想让FsCheck创建测试用例,其中每个字段a,b,c都限制为非负浮点数.

我怀疑这需要为myRecord创建一个生成器,但我无法找到任何如何执行此操作的示例.

谁能提供指导?

Mau*_*fer 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
Run Code Online (Sandbox Code Playgroud)

<!>是一个中缀map,适用于应用风格.这是一个等效的生成器:

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
Run Code Online (Sandbox Code Playgroud)

如果您不想全局注册生成器,可以使用forAll:

Check.Quick (forAll Generators.arbMyRecord verify_this_property)
Run Code Online (Sandbox Code Playgroud)

萎缩左侧作为练习;)

  • @DavidH:它是一个中缀`map`,对于应用风格很有用.见http://bugsquash.blogspot.com/2010/12/zipping-with-applicative-functors-in-f.html (2认同)