如何减少ScalaCheck生成的测试用例数?

时间:2015-05-21 05:40:53

标签: scala unicode specs2 scalacheck

我正在尝试解决两个ScalaCheck(+ specs2)问题:

  1. 有没有办法更改ScalaCheck生成的案例数?

  2. 如何生成包含某些Unicode字符的字符串?

  3. 例如,我想生成大约10个包含字母数字和Unicode字符的随机字符串。但是,此代码始终生成100个随机字符串,并且它们严格基于字母字符:

    call readDec

    修改

    我刚才意识到还有另一个问题:

    1. ScalaCheck经常放弃而不产生100个测试用例
    2. 当然我不想要100,但显然我的代码试图生成一套过于复杂的规则。它最后一次运行,我看到“47次测试后放弃了。”

1 个答案:

答案 0 :(得分:9)

&#34>经过47次测试后放弃了#34;错误意味着您的条件(包括suchThat谓词和==>部分)过于严格。幸运的是,将这些加入到您的生成器中往往不是很难,在您的情况下,您可以编写类似这样的内容(这也解决了挑选任意字符的问题,而不仅仅是字母数字):

val stringGen: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
  Gen.buildableOfN[String, Char](n, arbitrary[Char])
}

这里我们选择所需范围内的任意长度,然后选择任意数量的任意字符并将它们连接成一个字符串。

您还可以增加maxDiscardRatio参数:

import org.specs2.scalacheck.Parameters
implicit val params: Parameters = Parameters(maxDiscardRatio = 1024)

但这通常不是一个好主意 - 如果你丢弃大部分生成的值,你的测试需要更长的时间,重构你的生成器通常会更清洁,更快。

您还可以通过设置适当的参数来减少测试用例的数量:

implicit val params: Parameters = Parameters(minTestsOk = 10)

但是,除非你有充分的理由这样做,否则我建议相信默认值。