加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:18:33 所属栏目:安全 来源:网络整理
导读:我正在尝试解决两个 ScalaCheck(specs2)问题: 有没有办法更改ScalaCheck生成的案例数? 如何生成包含某些Unicode字符的字符串? 例如,我想生成大约10个包含字母数字和Unicode字符的随机字符串.但是,此代码始终生成100个随机字符串,并且它们严格基于字母字符
我正在尝试解决两个 ScalaCheck(specs2)问题:

>有没有办法更改ScalaCheck生成的案例数?
>如何生成包含某些Unicode字符的字符串?

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

"make a random string" in {
    def stringGenerator = Gen.alphaStr.suchThat(_.length < 40)
    implicit def randomString: Arbitrary[String] = Arbitrary(stringGenerator)

    "the string" ! prop { (s: String) => (s.length > 20 && s.length < 40) ==> { println(s); success; } }.setArbitrary(randomString)
}

编辑

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

> ScalaCheck经常放弃而不会产生100个测试用例

当然,我不想要100,但显然我的代码试图生成一套过于复杂的规则.它最后一次运行,我看到“47次测试后放弃了”.

解决方法

“47次测试后放弃”错误意味着您的条件(包括这样的谓词和==>部分)限制性太强.幸运的是,将这些加入到您的生成器中通常并不太难,在您的情况下,您可以编写类似这样的内容(这也解决了拾取任意字符的问题,而不仅仅是字母数字):

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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读