如何报告 scalacheck.Prop.forAll 属性 测试的所有测试用例输入?
How to report all test case input for scalacheck.Prop.forAll property test?
在使用 scalacheck 时,如果我们使用 forAll 测试任何 属性,那么我们只会收到报告的失败测试输入和 none 通过测试输入。
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 给出的所有随机测试输入报告给各自的 属性 测试?
使用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
never 总和为 37 绝对不正确,但它通过了 ScalaCheck
因为两个任意 Ints
产生的机会by ScalaCheck
总和为 37 非常小。但是,如果将 37 更改为 -2、-1、0、1 或 2 中的任何一个,测试可能会失败,因为值 -1、0 和 1 不成比例地频繁生成 Scalacheck's
implicit arbitrary[Int]
发电机。
在使用 scalacheck 时,如果我们使用 forAll 测试任何 属性,那么我们只会收到报告的失败测试输入和 none 通过测试输入。
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 给出的所有随机测试输入报告给各自的 属性 测试?
使用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
never 总和为 37 绝对不正确,但它通过了 ScalaCheck
因为两个任意 Ints
产生的机会by ScalaCheck
总和为 37 非常小。但是,如果将 37 更改为 -2、-1、0、1 或 2 中的任何一个,测试可能会失败,因为值 -1、0 和 1 不成比例地频繁生成 Scalacheck's
implicit arbitrary[Int]
发电机。