2011-11-16 12 views
5

F # içinde birkaç alanla ilgili bir kaydım var:FsCheck'te, negatif olmayan alanlarla test kaydı nasıl oluşturulur?

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

Bu kaydı kullanan bazı özellikleri test etmek için FsCheck kullanıyorum. (bir örnek)

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

myFunction'in dahili uygulama kısıtlamaları nedeniyle, FsCheck'in a, b, c alanlarının her birinin olmayan -nejatif yüzer.

Bunun myRecord için bir jeneratör oluşturması gerektiğinden şüpheleniyorum, ama nasıl yapacağına dair herhangi bir örnek bulamadık.

Herkes yol gösterebilir mi?

+0

dikkatle sizi Var);

Check.Quick (forAll Generators.arbMyRecord verify_this_property) 

bir egzersiz olarak bırakılmıştır küçülen: Eğer jeneratör kayıt global olarak istemiyorsanız

kullanabileceğiniz forAll: Bu eşdeğer jeneratör [bu FsCheck Wiki sayfasını okuyun] (http://fscheck.codeplex.com/wikipage?title=Test%20Data%20Generators&referringTitle=Home)? Bir jeneratörün nasıl yazılacağı ve kaydedileceğine dair bir örneği vardır. – fmr

+2

@ fmr - Evet FsCheck Wiki sayfalarını dikkatlice okudum. Basit bir jeneratör yazma adımları (çok açık bir şekilde IMHO değil) sağlanmakla birlikte, kayıt için bir jeneratör oluşturmak için bunu nasıl genişleteceğimi belirleyemiyorum - bu nedenle SO sorusu. –

cevap

7

bu deneyin:

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 

<!> uygulamalı stili için kullanışlı bir infix map vardır.

+0

"" ifadesinin anlamı nedir? Bunu daha önce hiç görmedim. –

+2

@DavidH: uygulama stili için kullanışlı bir infix 'map'. Bkz. Http://bugsquash.blogspot.com/2010/12/zipping-with-applicative-functors-in-f.html –

+0

@DavidH: biraz daha açıkladı. –

3

Sen 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) 

kullanarak özel jeneratör oluşturarak önleyebilirsiniz (esasen?) testinin yavaş yürütülmesine FsCheck tüm uygun olmayan deney girişlerini atmak zorunda kalacak beri.

İlgili konular