在使用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给出的所有随机测试输入报告给相应的属性测试吗?
答案 0 :(得分:3)
使用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
的任意对从不的总和不是绝对正确,但它通过ScalaCheck
是因为{{ 1}}之和等于37,实在是太小了。但是,如果将37更改为-2,-1、0、1或2中的任何一个,则测试可能会失败,因为值-1、0和1是由Ints
隐式{{1 }} 发电机。