Testing 在Specification.cleanup()中查找测试的结果/状态

Testing 在Specification.cleanup()中查找测试的结果/状态,testing,spock,Testing,Spock,这似乎是一个合理的事情想做。。。e、 g.在测试失败时记录一些内容,如果测试失败则不记录 例如,我发现,从2013年开始。。。当时没有简单有效的答案。现在呢 我希望能在org.spockframework.runtime.SpecificationContext中找到合适的属性/方法。。。或者可能org.spockframework.runtime.model.SpecInfo。。。但我什么也看不见 后来 为了回答这类问题,我可能想做:事实上,我的规范“劫持”了System.out(使用Prin

这似乎是一个合理的事情想做。。。e、 g.在测试失败时记录一些内容,如果测试失败则不记录

例如,我发现,从2013年开始。。。当时没有简单有效的答案。现在呢

我希望能在
org.spockframework.runtime.SpecificationContext
中找到合适的属性/方法。。。或者可能
org.spockframework.runtime.model.SpecInfo
。。。但我什么也看不见

后来

为了回答这类问题,我可能想做:事实上,我的
规范“劫持”了
System.out
(使用
PrintStream
),因此我可以捕获到
System.out
的输出,然后对其进行分析。注意:我知道斯波克纯粹主义者可能不赞成对终端输出感兴趣的测试,但我不是这样的纯粹主义者,特别是在谈论单元测试以外的测试时


以一种意味着它不在任何地方输出的方式获得此输出后,没有理由系统地记录它并将日志文件弄乱。。。但如果测试失败,我想这样做。对于
System.err,也可能如此。首先,记录失败的测试是测试框架(JUnit,Spock)的工作。因此,测试本身的状态并不容易从测试本身中获得也就不足为奇了。不管怎么说,如果你想在Spock中找到更有趣的东西,那么另一个线程中的和仍然有效。通过
cleanup()
方法,没有更简单的方法可以确定测试是否失败


无论如何,它并不像看上去那么复杂,因为你只需要设置一次,然后它就可以工作了。由于您没有提到您想要登录什么
cleanup()
,所以我想推测一下。出于演示目的,我只是记录了从规范上下文检索到的特性方法名称,以及从全局扩展注册的运行侦听器检索到的已发生错误的类(以便不将整个fancy Spock错误消息打印两次)

全局Spock扩展:

扩展注册一个运行侦听器,每当发生测试错误时,该侦听器都会记录错误信息。在每个特征或迭代开始时(对于具有
块的特征,其中:
块),清除最后记录的错误,以免流入下一个特征/迭代

package de.scrum\u master.testing.extension
导入org.spockframework.runtime.AbstractRunListener
导入org.spockframework.runtime.extension.AbstractGlobalExtension
导入org.spockframework.runtime.model.ErrorInfo
导入org.spockframework.runtime.model.IterationInfo
导入org.spockframework.runtime.model.SpecInfo
类TestResultExtension扩展了AbstractGlobalExtension{
@凌驾
无效访问规范(规范信息规范){
spec.addListener(新的ErrorListener())
}
静态类ErrorListener扩展了AbstractRunListener{
错误信息错误信息
@凌驾
迭代前无效(迭代信息迭代){
errorInfo=null
}
@凌驾
无效错误(错误信息错误){
errorInfo=错误
}
}
}
如何注册Spock扩展名:

您还需要将文件
META-INF/services/org.spockframework.runtime.extension.IGlobalExtension
添加到测试资源中,以便注册扩展名。该文件仅包含以下内容:

de.scrum\u master.testing.extension.testresulttension
顺便说一句,这不是一个Spock或Groovy特性,而是一个标准的JavaSE特性,名为

使用扩展名的样本测试:

这个测试非常愚蠢,但它展示了如何在普通方法和带有
的方法中工作,其中:
在带有和不带有
@Unroll
的情况下阻塞

package de.scrum\u master.testing.extension
导入spock.lang.Specification
导入spock.lang.Unroll
类TestFailureReportingTest扩展了规范{
def“故障正常功能”(){
期望:
0 == 1
}
def“通过正常功能”(){
期望:
0 == 0
}
def“参数化特征”(){
期望:
a==b
哪里:

“它不像看上去那么复杂”…呃,也许吧!我能说的是,这可能需要我一天的时间来解决。另外,vielen Dank!我在另一个上下文中再次发现了这一点,并更新了示例代码:测试打印展开的方法(迭代)如果您使用带有参数名称占位符的
@Unroll
,请立即命名。我还从拦截器中删除了多余的方法
beforefeact
。是否也可以使用注释来完成此操作?请提出新问题并显示代码,说明您想做什么和尝试了什么。谢谢。