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

时间:2015-02-24 17:29:15

标签: scala scalatest

我有许多测试数据集通过相同的ScalaTest单元测试。我很高兴,如果每个测试数据集都是它自己的一组命名测试,那么如果一个数据集失败了,那么我确切地知道它是哪一个,而不是去单个测试并查看什么提交失败。我似乎无法找到在运行时生成测试名称的方法。我已经查看了基于属性和表格的测试,目前正在使用should behave like来共享灯具,但这些似乎都没有达到我想要的效果。

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

4 个答案:

答案 0 :(得分:2)

您可以在测试名称中使用scala字符串替换。使用behavior functions,这样的方法可行:

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

trait PersonBehaviors { this: FlatSpec =>

  // or add data set name as a parameter to this function
  def personBehavior(person: => Person): Unit = {
    behavior of person.name

    it should s"have non-negative age: ${person.age}" in {
      assert(person.age >= 0)
    }
  }
}

class TheTest extends FlatSpec with PersonBehaviors {
  val person = Person("John", 32)

  personBehavior(person)
}

这会产生如下输出:

TheTest:
John
- should have non-negative age: 32

答案 1 :(得分:2)

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

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))
}

产生如下输出:

TheTests:
Data set Family
- should have no zero-length names

答案 2 :(得分:1)

您可以使用ScalaTest编写动态测试用例,就像乔纳森·乔在他的博客中写的: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)
       }
     }
   }
}

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

TestResults
  MyTest
    My test
      run test 1
      run test 2
      run test 3

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

答案 3 :(得分:0)

如何使用ScalaTest的线索机制,以便任何测试失败都可以作为线索报告使用哪个数据集?

  

您可以使用Assertions提供的withClue结构,   由ScalaTest中的每个样式特征扩展,以进行添加   有关失败或取消测试报告的额外信息。

另见AppendedClues

上的文档