在使用 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]生成器不成比例地頻繁生成的。
添加回答
舉報
0/150
提交
取消