【问题标题】:ScalaCheck not failing?ScalaCheck 没有失败?
【发布时间】:2017-06-11 01:13:55
【问题描述】:

我正在尝试将 ScalaTest 与 ScalaCheck 一起使用来进行基于属性的测试。我有下面列出的测试:

import org.scalatest.prop.PropertyChecks
import org.scalatest.{FlatSpec, Matchers}


object Calc {
  def add(a:Int, b:Int) = a+b

  def div(a:Int, b:Int) = a/b
}


class PropSpec1 extends FlatSpec with Matchers with PropertyChecks {
  behavior of Calc.getClass.getName


  it should "add integers" in {
    forAll { (a: Int, b: Int) =>
      Calc.add(a, b) shouldEqual a + b
    }
  }

  it should "divide integers" in {
    forAll {
      (a:Int, b:Int) => Calc.div(a, b) shouldEqual a/b
    }
  }
}

现在我看到的是,如果我一遍又一遍地在 PropSpec1 中运行测试,有时第二个测试会通过,但大多数时候它会失败。现在,如果 0 没有针对 b 进行测试,那么显然它会通过,但我认为这是它总是会尝试的事情之一。重复运行 sbt clean test 时,我看到了相同的行为;有时两个测试都会通过。

这对于基于属性的测试是否正常,或者我需要做些什么(比如总是提供我自己的生成器)?

【问题讨论】:

    标签: scala scalatest scalacheck property-based-testing


    【解决方案1】:

    但我认为这是它总是会尝试的事情之一

    假设是万恶之源。

    基本上,您要求 Scalacheck 为您生成的只是Int 的样本。有效的 Int 可以是约 40 亿个值之一。

    既然您知道 0 会导致此函数失败(抛出异常),您可以像这样简单地将其过滤掉:

    forAll { (a:Int, b:Int) =>
      whenever(a != 0 && b != 0) {
        Calc.div(a, b) mustEqual a/b
      }
    }
    

    P.S 如果您检查 whenever 函数的 scaladoc,则与您在此处询问的示例类似。

    【讨论】:

    • 谢谢...我知道任何时候。我更感兴趣的是强迫它尝试边缘情况,或者至少告诉它记住尝试 0(这在这种情况下没有意义,但这是一个更普遍的问题)。有什么办法吗?
    • 据我所知,您必须提供自定义生成器。可能还有其他方式,也许其他人会插话。
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多