【问题标题】:Spock test: Can when/then block labels be omitted (keeping code formerly separated by labels)? Are the labels syntax sugar?Spock 测试:可以省略 when/then 块标签(保持以前由标签分隔的代码)?标签是语法糖吗?
【发布时间】:2021-01-09 02:13:16
【问题描述】:

Spock testing 中,when:then: block labels(标签本身,而不是代码/phases 它们分开)是绝对必要的吗?或者它们在技术上只是syntactic sugar,可以省略(同时仍然拥有/保留原本会被标签分隔的代码行)?

我不确定在省略标签时刺激/响应阶段(相对于何时/然后)是否仍然执行相同的操作?

(我很想问这个问题,为了可能节省几行代码;这可能相对微不足道,但如果有人能回答我,我很感激。我所处的环境没有阅读或编写 Spock 测试的非技术或非技术用户 - 我尊重其他上下文,其中包含标签有助于其他非技术/非技术用户的可读性;这是有道理的。)

例如(1),考虑下面的feature method

def "a feature method with when/then labels"(){
  // setup phase code

  when:
  // stimulus phase code

  then:
  // response phase code

  where:
  // data table
}

下面的(示例 2)编辑(上面的示例,仅删除 when/then 标签)在功能上是否仍与上面相同?

def "a feature method withOUT when/then labels"(){
  // setup phase code

  // stimulus phase code

  // response phase code

  where:
  // data table
}

我至少部分地说服自己它们是等效的,我自己的测试之前/之后(类似上面的编辑)对我来说“看起来”功能相同(根据其结果) - 但是 我是当省略标签时,不确定相应的刺激/响应阶段是否仍然执行相同的操作。尽管我提到了我自己的测试的相同结果,但我不确定是否可能存在与结果本身不那么明显的差异化副作用。

如果上面的示例 2 构成其 where 块之上的所有内容,我不会感到惊讶,都在其 implicit given block 中。但即使是这样,我也不确定这是否会有所不同,因为这两个示例在功能上是否相同。


这里有一些when/then block pair 事实(供其他人参考):

  • 如果您编写其中一个 {when, then} 标签,您必须编写另一个 - 它们始终以 [相邻] 对存在。不能只写when: 或只写then:(对于给定的一对刺激/响应阶段)
  • 同一特征方法中的多个 when/then 块对非常好
  • 特征方法必须始终至少有 1 个标记块(根据这一点,我认为哪一个都没有关系)

【问题讨论】:

    标签: unit-testing groovy syntax spock


    【解决方案1】:

    我建议你阅读Spock manual。这些块带有语义,并且根据您构建它们的方式,Groovy 编译器将根据您的 Spock 规范应用 AST(抽象语法树)转换。

    您为什么要使用 Spock 并尝试抛弃此工具提供给您的语义?如果您不喜欢 Spock 测试的行为驱动结构,只需使用纯 Java 或 Groovy 测试以及您选择的工具,例如 JUnit 或 TestNG。但是,如果您希望使用模拟,则需要额外的模拟工具,具有讽刺意味的是,这些工具通常会重新引入行为驱动的 when-then 或 given-expect 类型的结构。

    正如您所注意到的,您至少需要一个特定于 Spock 的块才能将测试识别为特征方法。虽然您可以省略 given|setup 而只使用 expect 而不是 when-then,但这仅适用于有意义的情况。尽量不要将所有内容都强加到该结构中,但也要使用其他块类型,以便清楚地描述规范中的每个功能。从技术上讲,then|expect 块为您带来所有指定条件的自动断言语义(无需使用assert 或像assertEquals 这样的JUnit 方法)。 where 块为您带来简单的特征方法参数化。可选的 cleanup 块可帮助您干净地关闭和/或清理测试资源,而无需手动使用 try-finally 构造。

    我建议你学习如何正确使用 Spock 作为工具并享受它的功能,而不是试图绕过它,这会使使用它变得毫无意义。

    【讨论】:

    • 还有一点需要说明:它们不仅仅是标签——它们可以“讲故事”。写when: "user is not logged in" ... then: "access to X is denied" ... 很常见
    • 是的,但对我来说,这是 BDD 测试风格的一部分,实际上只是语法糖,尽管我大量使用它,因为行为驱动的测试有充分的理由被称为 规范乙>。这些 cmets 和标签可用于测试报告是另一个优点。但所有这些都记录在 Spock 手册中。
    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2014-09-12
    • 2019-07-23
    • 2017-09-08
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多