我习惯了JUnit,在JUnit中,只需在单个文件(类)中定义多个测试并使用@Test
注释它们,就可以对这些测试(通常与一个类相关)进行分组。然后,为了运行几个这样的测试,需要使用@Suite.SuiteClasses
创建一个TestSuite
,依此类推。
在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
。顺便说一下:我使用Specs2是因为我认为它是标准的(在默认情况下使用原型,一个(非常精简的)小样本(和轶事)证实了这一点[1,2]),但我正在考虑使用ScalaTest。从数字(specs2,scalatest)来判断,这可能是遵循Scala社区的标准和习惯的最佳选择。我之所以提到这一点,是因为这样的回答是可以接受的,比如“不可能,使用ScalaTest”。
发布于 2015-03-20 17:59:57
在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
组织
使用引用和标签,你可能可以想象出几种切分测试源的方法:
您可以使用引用来创建specifications
io
,slow
,database
,scalacheck
...,
请注意,您也可以将以上所有内容混合在一起,并在引用、示例和引用的规范上添加标签,等等。
选择给定结构的标准是:
https://stackoverflow.com/questions/29147861
复制相似问题