如何使用 specs2 对测试进行分组?
How to group tests using specs2?
我习惯了 JUnit,在 JUnit 中可以将几个测试(通常与 class 相关)分组,只需在单个文件 (class) 中定义这些测试并注释他们 @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
被分成几个 classes 而 Specification
在一个 [=43] =](即文件),这往往会产生巨大的文件。
所以问题有两个方面:
- 为了组织和可读性,我应该把这些东西放在哪里:一个
Specification
和每个 class 应该做的事情,即它应该通过的检查。
- 如果整组测试被分成几个文件,我如何创建一个
Suite
以分层方式对它们进行分组,例如作为 ScalaTest 的 Suites
。
顺便说一句:我正在使用 Specs2,因为我认为它是标准的(默认情况下是原型,一个(非常减少的)小(和轶事)样本证实了这个 [1, 2]), but I am considering to use ScalaTest. Judging by numbers (specs2, scalatest)可能是遵循 Scala 社区的标准和习俗的最佳选择。我之所以提到这一点,是因为出于这些原因,像 "it's not possible, use ScalaTest" 这样的答案是可以接受的。
在 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
开始,这样低级依赖在高级依赖之前执行。任何循环都被打破,这样你就不会无限地执行事情(或得到 WhosebugError
)。
标签
标签是一种非常方便的分类方式,因为给定的 "thing" 不需要只属于一个类别。这在当时是 TestNG 带来的重大改进之一。在 specs2 中,您可以标记单个示例或整个规范,然后根据 [=91= 声明要 运行 的示例] 的一些标签。例如
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
组织
使用引用和标签,您可能可以想象出几种对测试源进行切片和切块的方法:
- 您可以使用参考来创建主要 "taxonomy" 规范
- 您可以使用标签创建 "cross-cutting" 问题,例如
io
、slow
、database
、scalacheck
...
请注意,您也可以混合使用上述所有内容,并在参考资料、包含示例和参考资料的规范等上添加标签。
选择给定结构的标准是:
- 代码库中概念的导航
- 不同套件的执行速度
- 有必要在更改后重新运行 测试的某些方面
- 基础架构限制(并非所有内容都可以 运行 在任何环境中)
我习惯了 JUnit,在 JUnit 中可以将几个测试(通常与 class 相关)分组,只需在单个文件 (class) 中定义这些测试并注释他们 @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
被分成几个 classes 而 Specification
在一个 [=43] =](即文件),这往往会产生巨大的文件。
所以问题有两个方面:
- 为了组织和可读性,我应该把这些东西放在哪里:一个
Specification
和每个 class 应该做的事情,即它应该通过的检查。 - 如果整组测试被分成几个文件,我如何创建一个
Suite
以分层方式对它们进行分组,例如作为 ScalaTest 的Suites
。
顺便说一句:我正在使用 Specs2,因为我认为它是标准的(默认情况下是原型,一个(非常减少的)小(和轶事)样本证实了这个 [1, 2]), but I am considering to use ScalaTest. Judging by numbers (specs2, scalatest)可能是遵循 Scala 社区的标准和习俗的最佳选择。我之所以提到这一点,是因为出于这些原因,像 "it's not possible, use ScalaTest" 这样的答案是可以接受的。
在 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
开始,这样低级依赖在高级依赖之前执行。任何循环都被打破,这样你就不会无限地执行事情(或得到 WhosebugError
)。
标签
标签是一种非常方便的分类方式,因为给定的 "thing" 不需要只属于一个类别。这在当时是 TestNG 带来的重大改进之一。在 specs2 中,您可以标记单个示例或整个规范,然后根据 [=91= 声明要 运行 的示例] 的一些标签。例如
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
组织
使用引用和标签,您可能可以想象出几种对测试源进行切片和切块的方法:
- 您可以使用参考来创建主要 "taxonomy" 规范
- 您可以使用标签创建 "cross-cutting" 问题,例如
io
、slow
、database
、scalacheck
...
请注意,您也可以混合使用上述所有内容,并在参考资料、包含示例和参考资料的规范等上添加标签。
选择给定结构的标准是:
- 代码库中概念的导航
- 不同套件的执行速度
- 有必要在更改后重新运行 测试的某些方面
- 基础架构限制(并非所有内容都可以 运行 在任何环境中)