2011-09-27 44 views
8

我希望我的所有屬性除了一些隨機值之外,還要至少測試一組固定的特殊值。我想在我的生成器規範中定義這個,而不是在每個使用該生成器類型的測試中。例如,如果我生成Ints,我希望我的生成器對每個測試用例始終生成至少0,1和-1。這可能嗎?如何讓ScalaCheck的任意總是生成一些特殊情況值?

我來了這麼遠,最好是做一個大小發電機,其中最小的ñ大小對應於我ň特殊情況。這是有問題的,至少因爲所有可能的尺寸在測試的最大數量被配置爲低於最大尺寸參數時未被測試。

回答

17

首先,有已經是在Scalacheck偏置使0,1,-1,Int.MaxValueInt.MinValue很可能除了其他Int值作爲選。所以,如果這是你的擔心,不要擔心。同樣,空串可能會生成。

但是,如果你想重現這一行爲別的東西,使用Gen.oneOfGen.frequency,也許連同Gen.choose。由於oneOffrequencyGen作爲參數,因此可以將特殊情況與通用生成器結合使用。

例如:

val myArb: Arbitrary[Int] = Arbitrary(Gen.frequency(
    1 -> -1, 
    1 -> 0, 
    1 -> 1, 
    3 -> Arbitrary.arbInt.arbitrary 
)) 

請問幾乎你問什麼,任意整數的50%的機會(這會與我說話的偏差),併爲每個-1 16.6%, 0和1.

+0

好吧,我想我會很有可能解決。感謝您的徹底解答!我實際上是生成布爾表達式btw。 – mpartel