gpt4 book ai didi

scala - 如何使用 specs2 对测试进行分组?

转载 作者:行者123 更新时间:2023-12-04 06:59:42 26 4
gpt4 key购买 nike

我习惯了 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作为 Suite在 JUnit 中,除了 Suite分为几个类和一个 Specification属于单个类(即文件),往往会产生巨大的文件。

所以问题有两个方面:
  • 为了组织和可读性,我应该把这些东西放在哪里:a Specification以及每个类(class)应该做的事情,即它应该通过的检查。
  • 如果整个测试组被分成几个文件,我如何创建 Suite如果可能,以分层方式对它们进行分组,例如作为 Suites 对于 ScalaTest。

  • 顺便说一句:我使用 Specs2 是因为我认为它是标准的(默认情况下是原型(prototype),一个(非常减少的)小(和轶事)样本证实了这一点 [ 12]),但我正在考虑使用 ScalaTest。从数字( specs2scalatest)来看,这可能是遵循 Scala 社区标准和习俗的最佳选择。我之所以提到这一点,是因为出于这些原因,像“不可能,使用 ScalaTest”这样的答案是可以接受的。

    最佳答案

    规范2 没有分层套件的概念。规范只是示例列表。即使您将它们与 xxx should yyy 组合在一起,这只会影响示例在控制台中的显示方式,或多或少有缩进。

    另一方面,有一些方法可以用 组织规范。规范2 :

  • references
  • 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 执行规范时争论
    sbt> test-only ParentSpec -- all

    然后依赖关系从 ParentSpec 开始。以便在高级依赖项之前执行低级依赖项。并且任何循环都被打破,这样你就不会无限地执行事情(或得到 StackOverflowError )。

    标签

    标签是对事物进行分类的一种非常方便的方法,因为给定的“事物”不需要只属于一个类别。这在当时是 TestNG 带来的重大改进之一。 .在 规范2 您可以标记单个示例或整个规范,然后根据某些标记的包含/排除声明要运行的示例。例如
    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

    组织

    使用引用和标签,您可能会想出几种方法来对您的测试源进行切片和切 block :
  • 您可以使用引用来创建规范的主要“分类”
  • 您可以使用标签来创建“跨领域”关注点,例如 io , slow , database , scalacheck ...

  • 请注意,您也可以混合使用以上所有内容,并在您的引用文献、带有示例和引用文献的规范等上添加标签。

    选择给定结构的标准是:
  • 代码库中的概念导航
  • 不同套件的执行速度
  • 更改后仅重新运行测试的某些方面的必要性
  • 基础设施限制(并非一切都可以在任何环境中运行)
  • 关于scala - 如何使用 specs2 对测试进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29147861/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com