sbt不会将ScalaTest表驱动的属性检查识别为测试

时间:2014-01-28 18:26:06

标签: unit-testing scala junit sbt scalatest

我写了一些ScalaTest Table-driven property checks,我试图用sbt test运行它们。查看报告,我看到ScalaTest可以识别我拥有的所有JUnit测试(它们与检查在同一个类中),它运行属性检查(即forAll正文) ,但它不会将forAll视为测试。如果失败,我会在报告中看到堆栈跟踪(ScalaTest测试异常失败),sbt表示测试运行期间出现“错误”,但它表示所有测试都已通过。报告中的测试总数仅包括JUnit个测试。

sbt中是否支持这种测试方式?

3 个答案:

答案 0 :(得分:6)

PropertyChecks中的

forAll不是测试。它本质上是一个美化的断言。您需要在命名测试中放置断言。怎么做取决于你选择的风格。例如,在FunSuite中,您可以编写如下内容:

class MySpec extends FunSuite with PropertyChecks {
  test("give the test a name here") {
    forAll(x: Int, y: Int) {
      // make assertions here
    }
  }
}

答案 1 :(得分:1)

不要调用forAll,而是让测试类从org.scalatest.prop.Checkers扩展,然后在每个测试中,使用要测试的属性调用check。在这种情况下,“Property”可能表示您创建的forAll

所以我猜你现在有一个看起来像的测试类:

class ExampleSuite extends AssertionsForJUnit {
  val fractions = Table(
    ("n", "d"),
    (  1,   2),
    ///...
  )
  forAll (fractions) { (n: Int, d: Int) => // ...

  @Test def verifySomethingElse = ???
}

我相信您需要做的是从Checkers延伸并将您的forAll移至测试中。

class ExampleSuite extends AssertionsForJUnit with org.scalatest.prop.Checkers {
  @Test def verifyFractions = {
    val fractions = Table(
      ("n", "d"),
      (  1,   2),
      ///...
    )
    check(forAll (fractions) { (n: Int, d: Int) => ???)
  }      


  @Test def verifySomethingElse = ???
}

答案 2 :(得分:0)

标准方法是使用Matchers和TableDrivenPropertyCheck创建FunSuite测试

示例:

import org.scalatest._
import org.scalatest.prop.TableDrivenPropertyChecks._

class CreateSpec extends FunSuite with Matchers {

  test("B-Tree-Create for different degree parameter value") {
    val params = Table(("degree", "result"),
      (0, Tree(Leaf(), 0)),
      (2, Tree(Leaf(), 1)),
      (1999, Tree(Leaf(), 1999)))

    forAll(params) {(degree, result) => Algorithms.create(degree) == result}
  }
 }