1

我正在尝试将 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 时,我看到了相同的行为;有时两个测试都通过。

这对于基于属性的测试是正常的,还是我需要做一些事情(比如总是提供我自己的生成器)?

4

1 回答 1

0

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

假设是万恶之源。

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

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

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

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

于 2017-01-25T18:36:19.930 回答