为什么Spock Speck测试如此罗嗦?

use*_*110 1 spock grails-2.0 spock-reports

来自JUnit背景我不太了解spockD测试中所有文本的要点,因为它们没有显示在测试的输出上.

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

我写这样的测试:

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()
}
Run Code Online (Sandbox Code Playgroud)

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

我得到的只是

Failure:  |
test constraints(com.grapevine.FooSpec)
 |
Condition not satisfied:
f.validate()
| |
| false    
Run Code Online (Sandbox Code Playgroud)

但我无法告诉表单这个报告是否未通过空约束或最大约束验证,然后我需要检查测试源中失败的行号.

至少我可以做JUnit

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

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

是否有某种方法可以从Spec获得更强大的错误报告,利用所有这些类型的when和then子句,以便它们出现在故障报告中,以便您知道实际上失败了什么?这些"何时"和"然后"文本描述符仅用作内部源文档还是在某处使用?

Pet*_*ser 5

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

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

而不是让一个测试检查两个不相关的情况(如在您的Spock/JUnit示例中),通常最好为每个案例进行单独的测试,并使用描述性名称.Spock的数据驱动测试可以帮助解决这个问题.

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

要回答你的标题问题,精心编写的Spock测试通常比JUnit测试要得多.