Spock和Maven。使用@Unroll进行的测试失败并出现错误,但占位符未填充Maven输出中的迭代数据

时间:2014-08-07 10:56:15

标签: java maven groovy spock

我有一些Spock的参数化测试,有10个案例来测试哪里有块。所以,我决定使用@Unroll注释,所以当10个案例中的一些失败时,我会理解哪一个。 所以我添加了功能占位符,其中包含有关它是什么类型的消息,让我们说它是

"Test with #message case"(String message, etc..){...}. 

如果我尝试在IDEA中启动它,输出看起来像预期的那样。 (在窗口左侧打开测试树)

Test with SomeIterationMessage case: failed
Test with AnotherIterationMessage case: failed

但是控制台IDEA输出如下所示:

Condition not satisfied:

resultList.size() == expectedSize
|          |      |  |
[]         0      |  1
              false
 <Click to see difference>

at transformer.NameOfSpec.Contract. Test with #message case (NameOfSpec.groovy:220)

如果我通过命令行启动Maven构建项目并且此测试失败,我只会收到IDEA控制台输出中的消息。所以它绝对没用,就像在IDEA控制台输出中一样。

Test with #message case: failed
Test with #message case: failed

因此,它不会用特定的迭代数据替换占位符来获取有关哪个迭代被压缩的信息。 如何理解IDEA控制台输出和Maven输出是否正确?因为如果不可能,这个@Unroll注释真的没什么。因为在IDE测试中可以毫无问题地通过,但是在一个有大量依赖关系的大型项目中,它可以在构建它时崩溃,并且你永远不会得到原因以及哪个迭代失败导致输出告诉你什么。

1 个答案:

答案 0 :(得分:0)

好的,所以它可以和Maven一起使用没问题。在IDE中,我们可以使用带有测试树的面板。它像我之前说的那样工作正常。 maven怎么样?是的,它在控制台输出中没有显示任何内容。但是当测试失败时我们可以去

target\surefire-reports

在我们的模块的根中,Maven为每个类生成并填充输出,并使用实际的迭代数据获得正确的迭代名称。

-------------------------------------------------------------------------------
Test set: *************************.***MapReduceSpec
-------------------------------------------------------------------------------
Tests run: 6, Failures: 0, Errors: 3, Skipped: 1, Time elapsed: 0.938 sec <<< FAILURE! - in *******************.DmiMapReduceSpec
MapReduce flow goes correctly for dataclass (contract)    (*******************.***MapReduceSpec)  Time elapsed: 0.185 sec  <<< ERROR!

其中值“(contract)”在方法字符串的末尾,取自迭代参数#message。所以原始方法名称看起来像

 "MapReduce flow goes correctly for dataclass (#message)"(){...}  

当然,这不是一个非常酷的技巧,但无论如何要快得多,然后调试20甚至更多的输入,其中块手动确定哪个是死的。