0

ScalaTest でプロパティ ベースのテストを行っていますが、次のコードがありました。

val myStrings = Gen.oneOf("hi", "hello")
forAll(myStrings) { s: String =>
  println(s"String tested: $s")
}

コードを実行するforAllと、同じ値が複数回試行されていることに気付きました。

String tested: hi
String tested: hello
String tested: hi
String tested: hello
String tested: hi
String tested: hello
...

上記のコードを考えると、各値をoneOf一度だけ試行する方法があるかどうか疑問に思っていました。つまり、ScalaTest が同じ値を 2 回使用しないようにするためです。

などの他のジェネレーターを使用したとしてもGen.alphaStr、同じ String を 2 回テストしないようにする方法を見つけたいと思います。私がこれを行うことに興味があるのは、各テストが異なるプロセスで実行されているサーバーに対して実行されるためです。そのため、多少のコストがかかるため、同じことを 2 回テストすることは避けたいと考えています。

4

2 に答える 2

0

値のエントロピーを増やすことを目指します。ランダムな文を使用すると、(理論的には) 問題を解決するわけではありませんが、大幅に増加します。

val genWord = Gen.onOf("hi", "hello")

def sentanceOf(words: Int): Gen[String] = {
   Gen.listOfN(words, genWord).map(_.mkString(" ")
}
于 2016-10-20T09:00:24.863 に答える
0

あなたがやろうとしていることは、scalacheck のイデオロギーに反しているようです (注 1 を参照)。ただし、サンプル数を減らすことで(高い確率で)可能です。

scala> forAll(oneOf("a", "b")){i => println(i); true}.check(Test.Parameters.default.withMinSuccessfulTests(2))
a
b
+ OK, passed 2 tests.

scala-check はランダム性と統計的アプローチに基づいて構築されているため、aa/bb を取得できる場合があることに注意してください。常にすべての組み合わせをチェックする必要がある場合 - おそらく scala-check は必要ありません:

scala> assert(Set("a", "b").forall(_ => true))

基本的に、入力値の分布Genを表す無限のコレクションを作成できます。生成する値が多いほど、より良いサンプリングが得られます。したがって、可能な状態が N 個ある場合、それらが無限のコレクションで繰り返されないことを保証することはできません。

通常、いくつかのジェネレーター/プロップを組み合わせるとwithMinSuccessfulTests、それらすべてに影響を与えます。これは、テスト構成に非常に便利です (パフォーマンスを向上させるためにサンプルのサイズを選択できます)。

注 1) 組み合わせの数を最大 (100 を超える) から適切なチェックが得られる値に減らすために必要な scalacheck は何ですか。したがって、可能な入力のセットが非常に大きい場合、scalacheck は便利です。その場合、繰り返しの確率は本当に小さいです

PS について話していますoneOf(scaladoc から):

def oneOf[T](t0: T, t1: T, tn: T*): Gen[T]

リストからランダムな値を選択します

(例は少し古くなっています) も参照してください: ScalaCheck が生成するテスト ケースの数を減らすにはどうすればよいですか?

于 2016-10-20T08:51:27.537 に答える