2011-11-16 42 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將不得不放棄所有不適合的測試項。

相關問題