如何在Spock 1.x中忽略测试并记录跳过原因
Spock 1.3中实现带跳过原因的条件忽略测试方案
针对你在Spock 1.3里需要根据变量控制测试执行,同时要在流水线中看到跳过测试及对应原因的需求,提供两个实用替代方案:
方案1:自定义扩展实现带原因的条件忽略注解
Spock 1.3支持自定义扩展,我们可以自己实现一个类似@IgnoreIf但包含跳过原因的注解:
- 先定义自定义注解
import java.lang.annotation.* import org.spockframework.runtime.extension.ExtensionAnnotation @Retention(RetentionPolicy.RUNTIME) @Target([ElementType.TYPE, ElementType.METHOD]) @ExtensionAnnotation(ConditionalIgnoreExtension) @interface ConditionalIgnore { // 条件判断闭包 Closure value() // 跳过原因描述 String reason() }
- 实现扩展逻辑类
import org.spockframework.runtime.extension.AbstractAnnotationDrivenExtension import org.spockframework.runtime.model.FeatureInfo import org.spockframework.runtime.model.SpecInfo class ConditionalIgnoreExtension extends AbstractAnnotationDrivenExtension<ConditionalIgnore> { // 处理类级别的注解 @Override void visitSpecAnnotation(ConditionalIgnore annotation, SpecInfo spec) { if (annotation.value().call()) { spec.skipped = true spec.skipReason = annotation.reason() } } // 处理方法级别的注解 @Override void visitFeatureAnnotation(ConditionalIgnore annotation, FeatureInfo feature) { if (annotation.value().call()) { feature.skipped = true feature.skipReason = annotation.reason() } } }
- 在测试中使用自定义注解
// 假设这是你的开关变量 def enabled = false // 作用在单个测试方法 @ConditionalIgnore(value = { !enabled }, reason = "Feature flag not enabled") def "test that should be skipped"() { expect: 1 == 1 } // 也可以作用在整个测试类 @ConditionalIgnore(value = { !enabled }, reason = "All tests in this spec are disabled by feature flag") class MySpec extends Specification { // ...测试方法 }
这个方案和原生@IgnoreIf的使用方式一致,跳过原因会被Spock写入测试报告,流水线中查看对应报告就能看到被跳过的测试及原因。
方案2:测试方法内直接调用skip()方法
如果不想写自定义扩展,也可以在测试方法内部通过条件判断手动跳过,并传入原因:
def enabled = false def "test that should be skipped"() { setup: // 判断开关,满足条件则跳过并设置原因 if (!enabled) { skip("Feature flag not enabled") return } expect: 1 == 1 }
这种方式更轻量,skip()方法传入的原因同样会被测试报告捕获,流水线能正常展示。
内容的提问来源于stack exchange,提问作者Jorge Guerreiro
相关产品推荐
相关产品推荐

