我正在寻找一个解决方案,允许我在测试框架执行的启动和结束时处理我的测试环境的设置和清理。 设置不是问题,但清理意味着知道测试框架何时完成工作或执行队列中当前测试的索引。 有人有解决方案来实现这个吗?
答案 0 :(得分:0)
一种解决方案是创建一个您所有规范都可以扩展的抽象类:
class AbstractSpec extends Specification
然后在AbstractSpec
中找出要运行的类(例如,如果您使用的是Spring框架):
private static final synchronized TEST_CLASSES = new ClassPathScanningCandidateComponentProvider(false).with {
addIncludeFilter(new AssignableTypeFilter(AbstractSpec.class))
findCandidateComponents("com/example/test").findAll { it.beanClassName != AbstractSpec.class.canonicalName }
.collect { Class.forName(it.beanClassName) }
}
然后在AbstractSpec
内部运行所有类之后进行实际清理:
def synchronized cleanupSpec() {
TEST_CLASSES.remove(getClass())
if (TEST_CLASSES.isEmpty()) {
// clean up here
}
}
此解决方案的问题是,如果您在IDE中运行测试或类的子集,则无法运行。您可能在类路径中包含了所有测试类,因此TEST_CLASSES
不会被清空,因此清理不会执行。
答案 1 :(得分:0)
您可以使用org.spockframework.runtime.extension.IGlobalExtension
来实现此目的,因为Spock扩展在所有规格开始之前和所有规格结束之后都具有回调。
public interface IGlobalExtension {
void start();
void visitSpec(SpecInfo spec);
void stop();
}
因此,根据您的情况实施stop()
,以完成您需要做的所有事情。
Spock通过Java的ServiceLoader
查找扩展名,因此请确保添加一个META-INF/services
文件(在Java9之前)或在您的module-info.java
文件中声明(在Java9之后),如此处所述:http://spockframework.org/spock/docs/1.1/extensions.html#_writing_custom_extensions