【问题标题】:How to report all test case input for scalacheck.Prop.forAll property test?如何报告 scalacheck.P​​rop.forAll 属性测试的所有测试用例输入?
【发布时间】:2019-01-09 20:30:57
【问题描述】:

在使用 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 给出的所有随机测试输入报告给相应的属性测试?

【问题讨论】:

    标签: java scala functional-programming scalacheck property-testing


    【解决方案1】:

    使用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,因为 ScalaCheck 生成的两个任意 Ints 总和为 37 的机会相当大该死的小。但是,如果将 37 更改为 -2、-1、0、1 或 2 中的任何一个,则测试可能会失败,因为值 -1、0 和 1 由 Scalacheck's 隐式 arbitrary[Int] 生成器不成比例地频繁生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多