2014-01-10 82 views
1

我正在使用Scalacheck並希望生成給定大小的集合。在scalaCheck中有一個特殊功能,Gen.listOfN(size, Gen[T])。 當我在forAll方法中打印生成的集合的大小時,它並不總是具有定義的大小。實際上它只在第一次嘗試時具有給定的尺寸。例如,大小6 - >第一次嘗試收集的大小是6,第二次嘗試的大小隻有3。我在做什麼錯了?ScalaCheck集合生成器

回答

1

這聽起來像你可能會使用一箇舊的(前1.11.0)版本的ScalaCheck。在這些版本中,發電機邊界並不總是受到尊重。

當ScalaCheck發現您的屬性失敗的測試用例時,它會嘗試簡化該測試用例(使它變得更小)。如今(版本> = 1.11.0),ScalaCheck試圖在進行這種簡化時試圖遵守示例listOfN,而不是測試列表中包含的項目少於n。但是,在某些情況下,ScalaCheck仍不可能知道發電機從一開始就有什麼界限,例如當您使用Gen.map方法時。

有關何時ScalaCheck仍可能以意想不到的方式簡化測試用例(你可以做,以減輕它是什麼)的案件的詳細信息,請參閱:Scalacheck won't properly report the failing case

+0

你知道的任何指引如何避免使用'地圖'爲了避免邊界(或其他元)信息迷路? –

+0

唯一的一般建議是使用'Gen.suchThat'方法簡單地添加生成器的不變量。發生器/收縮功能是改進的目標,因此如果您有任何特別的用例會讓您覺得很麻煩,我很樂意聽到這些信息。 –