15

scalacheckプロジェクトのUserGuideは、サイズのジェネレーターについて言及しました。説明コード

def matrix[T](g:Gen[T]):Gen[Seq[Seq[T]]] = Gen.sized {size =>
 val side = scala.Math.sqrt(size).asInstanceOf[Int] //little change to prevent compile-time exception
 Gen.vectorOf(side, Gen.vectorOf(side, g))
}

私には何も説明しなかった。いくつかの調査の結果、生成されたシーケンスの長さはジェネレーターの実際のサイズに依存しないことがわかりました(javadocによると「ジェネレーターのサイズ変更されたバージョンを作成する」というGenオブジェクトのresizeメソッドがあります(おそらくそれは何か違うことを意味しますか?))。

val g =  Gen.choose(1,5)
val g2 = Gen.resize(15, g)
println(matrix(g).sample) //  (1)
println(matrix(g2).sample) // (2)
//1,2 produce Seq with same length 

私が見逃したことを説明し、コードのテストでそれらをどのように使用するかについていくつかの例を教えてください。

4

2 に答える 2

19

vectorOf現在はに置き換えられていlistOfます)は、ScalaCheckがジェネレーターを評価するときに設定するサイズパラメーターに(線形に)依存するサイズのリストを生成します。ScalaCheckがプロパティをテストするとき、テストごとにこのサイズパラメータが増加し、その結果、プロパティはますます大きなリストでテストされます(listOf使用されている場合)。

生成器をネストされた方法で使用して行列生成器を作成するlistOfと、サイズパラメーターの2乗に依存するサイズの行列が得られます。したがって、プロパティでこのようなジェネレーターを使用すると、ScalaCheckが各テスト実行のサイズパラメーターを増やすため、非常に大きな行列になる可能性があります。ただし、resizeScalaCheckユーザーガイドで行われている方法でジェネレータコンビネータを使用すると、最終的なマトリックスサイズはサイズパラメータに直線的に依存するため、プロパティをテストする際のパフォーマンスが向上します。

resizeジェネレータコンビネータを頻繁に使用する必要はありません。特定のサイズで制限されたリストを生成する必要がある場合は、代わりに以下の例のようなことを行うことをお勧めします。これは、listOf/containerOfジェネレーターが実際にサイズパラメーターを期待どおりに使用する保証がないためです。

def genBoundedList(maxSize: Int, g: Gen[T]): Gen[List[T]] = {
  Gen.choose(0, maxSize) flatMap { sz => Gen.listOfN(sz, g) }
}
于 2010-12-08T10:39:33.080 に答える
12

使用するメソッドは非推奨であり、 listOfvectorOfメソッドを使用する必要があります。これにより、ランダムな長さのリストが生成されます。最大長は、ジェネレーターのサイズによって制限されます。したがって、生成される最大要素を制御する場合は、実際のリストを実際に生成するジェネレーターのサイズを変更する必要があります。


scala> val g1 = Gen.choose(1,5)
g1: org.scalacheck.Gen[Int] = Gen()

scala> val g2 = Gen.listOf(g1)  
g2: org.scalacheck.Gen[List[Int]] = Gen()

scala> g2.sample
res19: Option[List[Int]] = Some(List(4, 4, 4, 4, 2, 4, 2, 3, 5, 1, 1, 1, 4, 4, 1, 1, 4, 5, 5, 4, 3, 3, 4, 1, 3, 2, 2, 4, 3, 4, 3, 3, 4, 3, 2, 3, 1, 1, 3, 2, 5, 1, 5, 5, 1, 5, 5, 5, 5, 3, 2, 3, 1, 4, 3, 1, 4, 2, 1, 3, 4, 4, 1, 4, 1, 1, 4, 2, 1, 2, 4, 4, 2, 1, 5, 3, 5, 3, 4, 2, 1, 4, 3, 2, 1, 1, 1, 4, 3, 2, 2))

scala> val g3 = Gen.resize(10, g2)
g3: java.lang.Object with org.scalacheck.Gen[List[Int]] = Gen()

scala> g3.sample
res0: Option[List[Int]] = Some(List(1))

scala> g3.sample
res1: Option[List[Int]] = Some(List(4, 2))

scala> g3.sample
res2: Option[List[Int]] = Some(List(2, 1, 2, 4, 5, 4, 2, 5, 3))
于 2010-09-08T15:29:35.843 に答える