如何使用 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] =](即文件),这往往会产生巨大的文件。

所以问题有两个方面:

顺便说一句:我正在使用 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" 问题,例如 ioslowdatabasescalacheck...

请注意,您也可以混合使用上述所有内容,并在参考资料、包含示例和参考资料的规范等上添加标签。

选择给定结构的标准是:

  • 代码库中概念的导航
  • 不同套件的执行速度
  • 有必要在更改后重新运行 测试的某些方面
  • 基础架构限制(并非所有内容都可以 运行 在任何环境中)