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

2024-01-07

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

所以问题有两个:

  • 出于组织和可读性的考虑,我应该把这些东西放在哪里:Specification以及每个类应该做的事情,即它应该通过的检查。
  • 如果整组测试被分成几个文件,我如何创建一个Suite如果可能的话,以分层方式对它们进行分组,例如作为Suites http://doc.scalatest.org/2.0/index.html#org.scalatest.Suites对于 ScalaTest。

顺便说一句:我使用 Specs2 因为我认为它是标准(默认情况下是原型,一个(非常减少的)小(和轶事)样本证实了这一点 [1 https://github.com/spray/spray, 2 https://github.com/twitter/summingbird]),但我正在考虑使用ScalaTest。从数字来看(specs2 http://mvnrepository.com/artifact/org.specs2, 分级测试 http://mvnrepository.com/artifact/org.scalatest)这可能是遵循 Scala 社区标准和惯例的最佳选择。我之所以提到这一点,是因为出于这些原因,像“不可能,使用 ScalaTest”这样的答案是可以接受的。


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...

请注意,您还可以混合上述所有内容,并在参考文献、带有示例和参考文献的规范等上添加标签。

选择给定结构的标准是:

  • 围绕代码库中的概念进行导航
  • 不同套件的执行速度
  • 更改后仅重新运行测试的某些方面的必要性
  • 基础设施限制(并非所有内容都可以在任何环境中运行)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用specs2对测试进行分组? 的相关文章

随机推荐

  • 使用条件更改 numpy 数组中的每个值

    我有一个从图像中获得的二维数组 现在它有 0 和 255 我想将所有 255 更改为 1 这对于for loop for i in range lenX for j in range lenY if img i j 255 img i j
  • 我可以在源perl程序中插入断点吗?

    我想要 perl 程序在某些条件满足时启动调试器 其他一些语言有库支持的 debug 语句 perl 中是否有类似的语句 如果我理解正确 您需要在代码中使用特定的调试器变量 DB single 在代码中将其设置为真值将导致调试器在该行停止
  • 使用 Powermock 模拟类的构造函数时出现 ExceptionInInitializerError。如何修复它?

    这是我的案例 我有一个 AbstractController 类 它有一个子类Controller 在 AbstractController 的方法之一中 实例化了一个新的 ApplicationLock 我想在为控制器编写 ut 时模拟
  • 将 CURLOPT_CAINFO 与更新的 CA 捆绑包一起使用会导致证书验证失败

    我使用 cURL 在 WordPress 插件中验证 PayPal 交易 最近 我开始收到有关用户因无法验证交易而无法完成购买流程的错误报告 我追踪到错误 SSL certificate problem verify that the CA
  • 从 TextView 到 EditText 的共享元素转换错误

    我正在尝试在TextView and a EditText but when showing the resulting Activity the text in theEditViewhave been shifted up See at
  • 我可以调用 jdbc 中的存储过程来使用 mysql 返回表吗?

    我是使用 jdbc 执行 mysql 存储过程的新手 我的问题是 是否可以调用返回 jdbc 中的表的存储过程 我搜索了很多 我知道我可以使用返回一定数量的参数registerOutParameter使用过程 但是包含几行的整个表怎么样 我
  • Facebook 应用程序如何向用户的所有好友发送消息?

    我们正在尝试构建一个应用程序 该应用程序可以根据登录用户的请求并在应用程序中进行适当的祝福 向任何或所有用户的 FB 好友发送一条消息 声明他们已收到一份礼物 我们已经能够以墙贴的形式向少数朋友发送此消息 通知和消息在 API 中不可用 然
  • 如何编写像 init.d 中使用的那样的 bash 脚本?

    我必须编写一个 bash 脚本来制作很多东西 我想像初始化脚本一样打印消息 例如 Doing A OK Doing B ERROR 你知道有什么方法可以做到这一点吗 提前致谢 在我所有的 Linux 机器上 执行此操作的代码位于文件中 et
  • 如何将依赖项注入 iOS 视图控制器?

    我的视图控制器需要向几个模型对象发送消息 如何获取视图控制器内这些模型对象的引用 这些模型对象是 单例 因为系统中一次只能有它们的一份副本 并且它们由多个视图控制器使用 所以我无法在每个视图控制器的 init 方法中实例化它们 我无法使用构
  • 如何在vb.net中检索mysql数据?

    我试图检索具有特定列的 mysql 数据并显示到 vb net 中的文本框 我应该怎么做才能取回它 Dim connect As New MySqlConnection server localhost user id root passw
  • 如何测试父元素对组件绑定的更改?

    我有一个如下所示的组件 想测试一下 onChange方法在绑定的情况下执行myBinding变化 我尝试了一整个早上 但找不到解决这个问题的方法 angular module project myComponent component my
  • 如何成功导入pygame.locals

    你好 Stackoverflowers 我正在学习如何使用 Pygame 进行编程 并且正在尝试导入 pygame locals 根据我正在学习的教程 我是这样开始的 import pygame sys from pygame locals
  • VS 2017 构建工具失败,错误 MSB4019:找不到导入的项目“D:\Microsoft.Cpp.Default.props”

    我正在构建一个新的 TFS 构建服务器 并决定使用 VS 2017 构建工具 而不是安装完整版本的 VS 当我尝试构建 C 项目时 它抛出以下错误 Error MSB4019 The imported project D Microsoft
  • 如何在javascript中清除localstorage、sessionStorage和cookie?然后检索?

    如何彻底清除localstorage sessionStorage and cookies在 JavaScript 中 有什么办法可以在清除这些值后恢复它们吗 如何彻底清除本地存储 localStorage clear 如何彻底清除sess
  • 如何使 navigator.vibrate 在页面加载时在 Onload 上工作

    我想让手机 设备在页面加载时振动 现在只有当我们点击振动按钮时振动才起作用 But the onload标记它不工作 给我一个解决方案来解决这个问题 我什至厌倦了添加window onload example1 也 但仍然不起作用
  • django 将模型实例转换为字典

    我是 Django 的初学者 我需要将 Model 实例转换为类似于 Model objects values 的字典 并带有关系字段 所以我写了一个小函数来做到这一点 def get proper instance field if fi
  • 动态加载 JavaScript 文件

    如何可靠且动态地加载 JavaScript 文件 这可用于实现一个模块或组件 当 初始化 时 该组件将根据需要动态加载所有需要的 JavaScript 库脚本 使用该组件的客户端不需要加载所有库脚本文件 并手动插入
  • Node.js、Express.js - 意外标记 {

    我的应用程序每次到达此行时都会崩溃 const name price req query 似乎无法找到确切的答案 这是错误日志 SyntaxError Unexpected token at exports runInThisContext
  • jsPDF 分页符

    我的页面 tab1 和 tab2 中有 2 个 div 我想将两个 div 导出到 1 个 PDF 文件中 其中 tab1 作为第一页 tab2 从下一页开始 目前 第二个 div 在导出的文件中出现损坏 因此我希望该 div 从下一页出现
  • 如何使用specs2对测试进行分组?

    我习惯了 JUnit 在 JUnit 中 只需在单个文件 类 中定义这些测试并用 Test 然后 为了运行其中几个测试 TestSuite是用创建的 Suite SuiteClasses等等 在specs2中 可以将多个测试分组在两个不同的