您可以从输入数据动态生成 ScalaTest 的测试名称吗?

Arn*_*sen 1 scala scalatest

我有许多通过相同 ScalaTest 单元测试运行的测试数据集。如果每个测试数据集都是它自己的一组命名测试,我会很高兴,所以如果一个数据集在其中一个测试中失败,我确切地知道它是哪一个,而不是去单个测试并查看它失败的文件。我似乎无法找到在运行时生成测试名称的方法。我看过基于属性和表的测试,目前正在使用should behave like共享装置,但这些似乎都没有做我想要的。

我是不是在 ScalaTest 中没有发现正确的测试方法,或者这是不可能的?

Joo*_*oer 7

您可以使用 ScalaTest 编写动态测试用例,就像 Jonathan Chow 在他的博客中所写的那样:http : //blog.echo.sh/2013/05/12/dynamically-creating-tests-with-scalatest.html

但是,我总是更喜欢WordSpec测试定义,这也适用于 Jonathan 提到的动态测试用例。

class MyTest extends WordSpec with Matchers {
   "My test" should {
     Seq(1,2,3) foreach { count =>
       s"run test $count" in {
          count should be(count)
       }
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

运行此测试时,它运行 3 个测试用例

TestResults
  MyTest
    My test
      run test 1
      run test 2
      run test 3
Run Code Online (Sandbox Code Playgroud)

附:您甚至可以foreach使用同一个count变量在同一个函数中执行多个测试用例。


til*_*lde 5

您可以编写一个基本测试类,并为每个数据集扩展它。像这样的东西:

case class Person(name: String, age: Int)

abstract class MyTestBase extends WordSpec with Matchers {

  def name: String
  def dataSet: List[Person]

  s"Data set $name" should {
    "have no zero-length names" in {
      dataSet.foreach { s => s.name should not be empty }
    }
  }
}

class TheTest extends MyTestBase {
  override lazy val name = "Family" // note lazy, otherwise initialization fails
  override val dataSet = List(Person("Mom", 53), Person("Dad", 50))
}
Run Code Online (Sandbox Code Playgroud)

产生如下输出:

TheTests:
Data set Family
- should have no zero-length names
Run Code Online (Sandbox Code Playgroud)