首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用specs2对测试进行分组?

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

Stack Overflow用户
提问于 2015-03-19 22:55:03
回答 1查看 1.6K关注 0票数 8

我习惯了JUnit,在JUnit中,只需在单个文件(类)中定义多个测试并使用@Test注释它们,就可以对这些测试(通常与一个类相关)进行分组。然后,为了运行几个这样的测试,需要使用@Suite.SuiteClasses创建一个TestSuite,依此类推。

在specs2中,可以在两个不同的级别上对几个测试进行分组,扩展一些Specification。例如:

代码语言:javascript
复制
  "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是因为我认为它是标准的(在默认情况下使用原型,一个(非常精简的)小样本(和轶事)证实了这一点[12]),但我正在考虑使用ScalaTest。从数字(specs2scalatest)来判断,这可能是遵循Scala社区的标准和习惯的最佳选择。我之所以提到这一点,是因为这样的回答是可以接受的,比如“不可能,使用ScalaTest”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-20 17:59:57

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

另一方面,还可以使用specs2组织规范

参考文献

您可以通过创建引用其他规范的顶级规范来创建规范层次结构:

代码语言:javascript
复制
// 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参数执行规范时

代码语言:javascript
复制
sbt> test-only ParentSpec -- all

然后,从ParentSpec开始执行依赖项,以便在执行高级依赖项之前执行低级依赖项。所有的循环都会被打破,这样你就不会无限地执行(或者得到一个StackOverflowError)。

标签

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

代码语言:javascript
复制
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标记的示例执行规范

代码语言:javascript
复制
sbt> test-only -- include functional exclude io

组织

使用引用和标签,你可能可以想象出几种切分测试源的方法:

您可以使用引用来创建specifications

  • you的主要“分类法”,可以使用标记来创建“横切”关注点,如ioslowdatabasescalacheck...

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

选择给定结构的标准是:

  • 围绕代码库中的概念导航
  • 不同套件的执行速度
  • 更改后仅重新运行测试的某些方面的必要性
  • 基础架构约束(并非所有内容都可以在任何套件中运行
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29147861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档