2012-09-28 14 views
14

私のspecs2テストスイートでScalaCheckプロパティテストを一時的に行い、デバッグを容易にしたいと考えています。現在、テストスイートを再実行するたびに異なる値が生成される可能性があります。これは、観察された動作の変更がコードの変更に起因するのか、別のデータの生成によるものなのかわからないためです。ScalaCheckテストを確定的にする

どうすればいいですか? ScalaCheckで使用されるランダムなシードを設定する正式な方法はありますか?

私はを使用してテストスイートを実行しています。

ボーナス質問:あなたも非決定性テストの実行を再現することができるようにプリントアウト ScalaCheckで使用する乱数シードの公式の方法は、ありますか?あなたは純粋なScalaCheckのプロパティを使用している場合は、あなたが使用されているjava.util.Randomインスタンスを変更すると、常に同じ値のセットを返した独自のものを提供するために、Test.Paramsクラスを使用することができるはず

+0

このデータの変更元はどこですか?データベース?サーバー? –

+0

@BrianAgnewいいえ、ScalaCheckによってランダムに生成されます。 –

答えて

10

def check(params: Test.Parameters, p: Prop): Test.Result

私はちょうどあなたがあなたの乱数発生器を指定するには、次の構文を使用することができ、新たなspecs2-1.12.2-SNAPSHOTを公開し

を[更新]:

case class MyRandomGenerator() extends java.util.Random { 
    // implement a deterministic generator 
} 

"this is a specific property" ! prop { (a: Int, b: Int) => 
    (a + b) must_== (b + a) 
}.set(MyRandomGenerator(), minTestsOk -> 200, workers -> 3) 
+0

「純粋なScalaCheckプロパティを使用する」とはどういう意味ですか?スペック2のものを使っていないのですか? –

+0

私はScalaCheck仕様を使用することを意味します:オブジェクトのStringSpecificationはScalaCheck UserGuideに示されているようにProperties( "String")を拡張します:https://github.com/rickynils/scalacheck/wiki/User-Guide – Eric

1

一般的に、非決定的な入力をテストするときは、エラーが発生したときにそれらの入力をどこかにエコーまたは保存するようにしてください。

データが小さい場合は、ユーザーに表示されるラベルまたはエラーメッセージにそのデータを含めることができます。

(私はScalaの構文に新たなんだので)
testLength(String x) { 
    assert(x.length > 10, "Length OK for '" + x + "'"); 
} 

データが大きい場合、例えば、自動生成されたDBのために、あなたが非でそれを格納可能性が次のいずれかのxUnitスタイルのテストでは、例えば(例えば、タイムスタンプ付きの名前を持つ/ tmp)、またはそれを生成するために使用されたシードを表示します。

次のステップは重要です。その値やシードなどを取り出し、確定的回帰テストに追加することで、毎回チェックするようにします。

あなたはこの問題を再現するためにScalaCheckを決定的に「一時的に」したいとします。私は単体テストになるのに適したバグのあるケースを見つけたと言います(おそらく手作業で単純化した後)。この構成は働い

0

scalacheck-1.12について:scalacheck-1.13については

new Test.Parameters { 
    override val rng = new scala.util.Random(seed) 
} 

をRNG方法が除去されるので、それはもう動作しません。何かご意見は?

関連する問題