如何让 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)
}
}
这样您将在循环的每次迭代中得到一个测试,因此所有情况都将独立执行,而在单个测试中的循环的情况下,它将在第一个失败的断言时失败并且不会检查剩余病例。
我是 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)
}
}
这样您将在循环的每次迭代中得到一个测试,因此所有情况都将独立执行,而在单个测试中的循环的情况下,它将在第一个失败的断言时失败并且不会检查剩余病例。