我想在Spock测试失败时执行一些操作。具体来说,截取屏幕截图。可能吗?怎么做?
答案 0 :(得分:9)
创建一个监听器类
class ExampleListener extends AbstractRunListener {
def void error(ErrorInfo error) {
println "Actual on error logic"
}
}
然后使用为每个Spec执行的IGlobalExtension
的实现将其添加到每个规范
class GlobalSpecExtension implements IGlobalExtension {
@Override
void visitSpec(SpecInfo specInfo) {
specInfo.addListener(new ExampleListener())
}
}
最后在您的org.spockframework.runtime.extension.IGlobalExtension
中创建一个名为META-INF/services directory
的文件(如果您使用Maven,通常会在src/test/resources
下),并使用您的IGlobalExtension
实现的全名,例如
com.example.tests.GlobalSpecExtension
答案 1 :(得分:3)
实现这一目标的最佳方法是编写一个(全局或注释驱动的)Spock扩展,它实现并注册AbstractRunListener
。有关示例,请参阅OptimizeRunOrderExtension。有关如何注册全局扩展,请参阅IGlobalExtension描述符。
关于扩展的文档不多,因为API仍有可能发生变化。如果你想安全地玩(并且可以有一些限制),你可以实现JUnit Rule。
在这两种情况下,您可能遇到的一个问题是它们不提供对当前规范实例的访问。如果需要,可能必须同时使用AbstractRunListener
(通知失败)和IMethodInterceptor
(获取规范实例),两者都由同一扩展名注册。 (不应该这么难,但这就是目前的情况。)
答案 2 :(得分:3)
我设法这样做了:
class ExampleTest extends GebSpec{
static boolean success = false
def setup(){
success = false
}
def cleanup(){
assert success == true, someAction()
}
def someAction(){
}
def "TestCase"(){
expect:
/*What you expect here*/
(success = true) != null
}
}
在每个测试用例之前,setup()方法将“success”设置为false。 在每个测试用例的末尾添加“(success = true)!= null”语句。因此,如果测试用例已经过去,“成功”将是正确的。 在每个测试用例之后,cleanup()方法将验证“success”是否为真。如果不是方法,则会调用someAction()。
答案 3 :(得分:0)
我无法对user3074543的回答进行投票或评论,但它比创建扩展程序更简单。我想要轻松。所以我缩短了用户一点(我不是指1行方法)。您可以通过记录失败而不是成功来简化逻辑,并使用done()帮助程序减少键入。
class Test extends spock.lang.Specification {
def fail
def setup(){ fail = true }
def done(){ !(fail = false) }
def cleanup(){ fail && doStuffWhenFail() }
def 'test things'(){
expect:
stuff
done()
}
}