如何让 scalatest/sbt 报告来自 TableDrivenPropertyChecks 的标记案例

How to have scalatest/sbt report labelled cases from TableDrivenPropertyChecks

我是 scalatest 的新手,在大量不一致的功能中有点迷茫

我正在尝试编写参数化测试。似乎这样做的方法是通过 TableDrivenPropertyChecks

我设法让它与这样的测试一起工作:

import org.scalatest.funspec.AnyFunSpec
import org.scalatest.prop.TableDrivenPropertyChecks

class MyTest extends AnyFunSpec with TableDrivenPropertyChecks {

  describe("the test") {

    val cases = Table(
      ("label", "a", "b"),
      ("case 2 > 1", 1, 2),
      ("case 4 > 3", 3, 4),
    )

    it("should...") {
      forAll(cases) { (name: String, a: Int, b: Int) =>
        assert(b > a)
      }
    }
  }
}

很好,但是当我 运行 它在 sbt 下时,我只看到:

[info] MyTest:
[info] the test
[info] - should...

如果我在 table 中注入错误案例,我会看到测试失败,所以我知道它们都在测试中。

我想要的是测试 运行ner 在 table.

中报告每个案例的内容

我看到了看起来他们会提供这个的例子,例如:https://blog.knoldus.com/table-driven-testing-in-scala/

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

class OrderValidationTableDrivenSpec extends FreeSpec with TableDrivenPropertyChecks with Matchers {

  "Order Validation" - {
    "should validate and return false if" - {
      val orders = Table(
        ("statement"                          , "order")
        , ("price is negative"                , Order(quantity = 10, price = -2))
        , ("quantity is negative"             , Order(quantity = -10, price = 2))
        , ("price and quantity are negative"  , Order(quantity = -10, price = -2))
      )

      forAll(orders) {(statement, invalidOrder) =>
        s"$statement" in {
          OrderValidation.validateOrder(invalidOrder) shouldBe false
        }
      }
    }
  }
}

但是如果我在测试中尝试这样做:

import org.scalatest.funspec.AnyFunSpec
import org.scalatest.prop.TableDrivenPropertyChecks

class MyTest extends AnyFunSpec with TableDrivenPropertyChecks {

  describe("the test") {

    val cases = Table(
      ("label", "a", "b"),
      ("case 2 > 1", 1, 2),
      ("case 3 > 4", 3, 4),
    )

    it("should...") {
      forAll(cases) { (label: String, a: Int, b: Int) =>
        s"$label" in {
          assert(b > a)
        }
      }
    }
  }
}

...我从 s"$label" in { 部分得到错误:value in is not a member of String

如何让我的 TableDrivenPropertyChecks 报告 table 中每个案例的内容?

ScalaTest 的一个很酷的特性是测试不是方法,因此您可以在循环内定义测试:

Table(
  ("a", "b"),
  (1, 2),
  (3, 4)
).forEvery({ (a: Int, b: Int) => {
  it(s"should pass if $b is greater then $a") {
    assert(b > a)
  }
}})

或者甚至不使用 Table,只使用任何集合:

Seq(
  (1, 2),
  (3, 4)
).foreach {
  case (a: Int, b: Int) =>
    it(s"should pass if $b is greater then $a") {
      assert(b > a)
    }
}

这样您将在循环的每次迭代中得到一个测试,因此所有情况都将独立执行,而在单个测试中的循环的情况下,它将在第一个失败的断言时失败并且不会检查剩余病例。