执行所有测试后清理(spock框架)

时间:2017-11-16 12:18:58

标签: java testing junit automated-tests spock

我正在寻找一个解决方案,允许我在测试框架执行的启动和结束时处理我的测试环境的设置和清理。 设置不是问题,但清理意味着知道测试框架何时完成工作或执行队列中当前测试的索引。 有人有解决方案来实现这个吗?

2 个答案:

答案 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