我有许多测试数据集通过相同的ScalaTest单元测试。我很高兴,如果每个测试数据集都是它自己的一组命名测试,那么如果一个数据集失败了,那么我确切地知道它是哪一个,而不是去单个测试并查看什么提交失败。我似乎无法找到在运行时生成测试名称的方法。我已经查看了基于属性和表格的测试,目前正在使用should behave like
来共享灯具,但这些似乎都没有达到我想要的效果。
我是否在ScalaTest中未发现正确的测试方法,或者这是不可能的?
答案 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中的每个样式特征扩展,以进行添加 有关失败或取消测试报告的额外信息。