2011-11-16 44 views
5

在F#中,我有几个字段的记录:在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的的内部实现的限制,我想有FsCheck创建测试用例,其中每个字段A,B,C的被限制于非 - 消极的花车。

我怀疑这需要创建一个发电机myRecord,但我一直没有找到任何如何做到这一点的例子。

任何人都可以提供指导吗?

+0

小心你有没有阅读[这个FsCheck Wiki页面](http://fscheck.codeplex.com/wikipage?title=Test%20Data%20Generators&referringTitle=Home)?它有一个如何编写和注册发生器的例子。 – fmr

+2

@ fmr - 是的,我仔细阅读了所有FsCheck Wiki页面。虽然提供了编写简单生成器的步骤(恕我直言,不是很清楚),但我无法确定如何扩展它以创建记录生成器 - 因此,SO问题。 –

回答

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 

<!>是一个中缀map,对应用性的风格是有用的。这是一个相当于发电机:

如果你不希望在全球范围内注册您的发电机,可以使用forAll

Check.Quick (forAll Generators.arbMyRecord verify_this_property) 

萎缩留作练习;)

+0

”构造的含义是什么?我以前没有见过。 –

+2

@DavidH:这是一个中缀“地图”,对于应用风格很有用。请参阅http://bugsquash.blogspot.com/2010/12/zipping-with-applicative-functors-in-f.html –

+0

@DavidH:多解释一下。 –

3

你能避免使用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) 

创建自定义生成虽然这将导致(基本?)测试的执行速度较慢,因为FsCheck将不得不放弃所有不适合的测试项。

相关问题