In specs2不存在分层套件的概念。规范只是示例列表。即使您将它们分组为xxx should yyy
,这只会影响示例在控制台中的显示方式,或多或少有缩进。
另一方面,有一些方法可以组织规范specs2:
- 参考 https://etorreborre.github.io/specs2/guide/SPECS2-4.2.0/org.specs2.guide.ReferenceOtherSpecifications.html
- tags https://etorreborre.github.io/specs2/guide/SPECS2-4.2.0/org.specs2.guide.Selection.html#use-tags
参考
您可以通过创建引用其他规范的顶级规范来创建规范的层次结构:
// 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 https://etorreborre.github.io/specs2/guide/SPECS2-3.1/org.specs2.guide.ArgumentsReference.html#reporting争论
sbt> test-only ParentSpec -- all
然后从以下依赖项ParentSpec
以便低级依赖关系在高级依赖关系之前执行。并且任何循环都会被打破,这样你就不会无限地执行事情(或者得到一个StackOverflowError
).
Tags
标签是一种非常方便的对事物进行分类的方法,因为给定的“事物”不需要只属于一个类别。这在当时是重大改进之一TestNG http://testng.org. In 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
tag
sbt> test-only -- include functional exclude io
组织
使用引用和标签,您可能可以想象几种对测试源进行切片和切块的方法:
- 您可以使用参考来创建规范的主要“分类法”
- 您可以使用标签来创建“横切”关注点,例如
io
, slow
, database
, scalacheck
...
请注意,您还可以混合上述所有内容,并在参考文献、带有示例和参考文献的规范等上添加标签。
选择给定结构的标准是:
- 围绕代码库中的概念进行导航
- 不同套件的执行速度
- 更改后仅重新运行测试的某些方面的必要性
- 基础设施限制(并非所有内容都可以在任何环境中运行)