为了账号安全,请及时绑定邮箱和手机立即绑定

如何报告 scalacheck.P​​rop.forAll 属性测试的所有测试用例输入?

如何报告 scalacheck.P​​rop.forAll 属性测试的所有测试用例输入?

呼唤远方 2021-06-08 17:56:53
在使用 scalacheck 时,如果我们使用 forAll 测试任何属性,那么我们只会报告失败的测试输入,而没有通过测试输入。scala> import org.scalacheck.Prop.forAll scala> val propConcatLists = forAll { (l1: List[Int], l2: List[Int]) =>                                        l1.size + l2.size == (l1 ::: l2).size }scala> propConcatLists.check + OK, passed 100 tests.有没有办法将 forAll 给出的所有随机测试输入报告给相应的属性测试?
查看完整描述

1 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

使用collect.


这个玩具示例说明了它的用途:


import org.scalacheck.Prop.{forAll,collect}


val q = forAll { (m: Int, n: Int) => collect(m, n, m+n) { m + n != 37 } }

q.check

上面的代码产生这个输出


+ OK, passed 100 tests.

> Collected test data: 

2% (0,-1,-1)

2% (-1,0,-1)

2% (-1,2147483647,2147483646)

<snip>

1% (1,0,1)

1% (-1199549050,-1564573392,1530844854)

1% (2147483647,0,2147483647)

1% (-1,-2147483648,2147483647)

免责声明:这个玩具示例显然不是一个设计良好的属性测试。虽然任意一对Ints 永远不会和 37绝对不是真的,但它通过了,ScalaCheck因为Ints通过ScalaCheck和 37生成两个任意的机会非常小。但是,如果将 37 更改为 -2、-1、0、1 或 2 中的任何一个,则测试可能会失败,因为值 -1、0 和 1 是由Scalacheck's隐式arbitrary[Int]生成器不成比例地频繁生成的。


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信