我已经习惯了JUnit,在JUnit中,只需在单个文件(类)中定义这些测试并使用@Test
注释它们,就可以将多个测试(通常与类相关)组合在一起。然后,要运行其中一些测试,会使用TestSuite
创建@Suite.SuiteClasses
,依此类推。
在specs2中,可以将两个不同级别的多个测试分组,扩展一些Specification
。例如:
"Whatever" should {
"do its job when possible" in {
whatever(new Thing).work must beSome
}
"return none when not possible" in {
whatever(null).work must beNone
}
}
我们可以将这种类型的多个Specification
组合在一个文件中,并且每个文件都可以包含多个检查,每个检查都像@Test
,每个组都像JUnit中的文件一样然后每个Specification
作为JUnit中的Suite
,除了Suite
被分成几个类而Specification
在一个类(即文件)中,这往往会产生巨大的文件。
所以问题有两个:
Specification
以及每个班级应该做的事情,即它应该通过的检查。Suite
,如果可能的话,以分层方式对它们进行分组,例如作为ScalaTest的Suites
。答案 0 :(得分:10)
在 specs2 中,没有分层套件的概念。规范只是一个示例列表。即使用xxx should yyy
对它们进行分组,这只会影响控件中显示示例的方式,或多或少有缩进。
另一方面,有一些方法可以使用 specs2 来组织规范:
您可以通过创建引用其他规范的顶级规范来创建规范层次结构:
// code for specs2 3.x
class ParentSpec extends Specification { def is = s2"""
These are all the important specifications about our domain
${"child1" ~ ChildSpec1}
${"child2" ~ ChildSpec2}
"""
}
子规格可以参考其他规格等。与JUnit(可能还有ScalaTest)的不同之处在于您的参考图不需要是树。使用all
参数
sbt> test-only ParentSpec -- all
然后从ParentSpec
开始遵循依赖关系,以便在高级别之前执行低级别依赖关系。任何周期都会被打破,这样你就不会无限地执行任务(或获得StackOverflowError
)。
标签是对事物进行分类的一种非常方便的方法,因为给定的“事物”不需要只属于一个类别。当时,这是TestNG带来的重大改进之一。在 specs2 中,您可以标记单个示例或整个规范,然后根据包含/排除某些标记声明要运行的示例。例如
class Spec1 extends mutable.Specification { section("functional")
"simple test" >> ok
tag("io")
"a bit of IO" >> ok
}
class Spec2 extends mutable.Specification { section("functional")
"another simple test" >> ok
tag("io")
"another bit of IO" >> ok
}
然后,您只能使用functional
标记执行规范,但不能使用io
标记
sbt> test-only -- include functional exclude io
使用引用和标记,您可以想象几种切片和切块测试源的方法:
io
,slow
,database
,scalacheck
...... 请注意,您还可以混合上述所有内容,并在您的参考文献上添加标签,包含示例和参考的规范等等。
选择给定结构的标准是: