1

来自 JUnit 背景,我并不真正理解 spockD 测试中所有文本的意义,因为它们没有显示在测试的输出中。

因此,例如,如果我对具有约束 foo max:5, nullable:false 的字段 Double foo 有约束

我写这样的测试:

void "test constraints" {
   when: "foo set to > max"
     foo=6D
   then: "max validation fails"
     !foo.validate()
   when: "foo is null
     foo=null
   then: "null validation fails"
     !foo.validate()
}

该测试在其源代码中有详细记录,但如果验证失败,则错误输出不会利用我为使测试清晰而所做的所有这些额外输入。

我得到的只是

Failure:  |
test constraints(com.grapevine.FooSpec)
 |
Condition not satisfied:
f.validate()
| |
| false    

但是我无法从这个报告中看出它是否未能通过空约束或最大约束验证,然后我需要检查测试源中失败的行号。

至少使用 JUnit 我可以做到

foo=60D;
assertFalse("contraints failed to block foo>max", f.validate());
foo=null;
assertFalse("contraints failed to block foo=null", f.validate());

然后我会从失败报告中得到有用的信息。这似乎更简洁,并提供了更丰富的测试失败报告。

是否有某种方法可以从 Spec 中获得更强大的错误报告,利用所有这些类型的 when 和 then 子句,以便它们显示在失败报告中,以便您知道实际失败的原因?这些“when”和“then”文本描述符是仅用作内部源文档还是在某处使用?

4

1 回答 1

5

块描述主要用于更高级别的测试;它们很少用于单元测试。也就是说,Spock 有几个第三方报告扩展:

至少其中一些也会输出块描述。此外,计划在下一个 Spock 版本中提供开箱即用的高级报告。

与其让一个测试检查两个不相关的案例(如在您的 Spock/JUnit 示例中),不如为每个案例单独测试一个具有描述性名称的测试。Spock 的数据驱动测试可以帮助解决这个问题。

虽然可以为 Spock 条件添加描述(例如assert 1 == 2, "not quite"),但我几乎总是更喜欢默认的“电源断言”输出。

为了回答您的标题问题,编写良好的 Spock 测试通常比 JUnit 测试少很多冗长。

于 2014-12-02T23:04:17.570 回答