简体   繁体   中英

cleanup after execution of all tests ( spock framework )

i'm looking for a solution that allow me to handle the setup and the cleanup of my test environment at the launch and the end of my test framework execution. The setup is not a problem but the cleanup imply to know when the test framework has finished to work or the index of the current test in execution queue. Has someone a solution to implement this?

You can use org.spockframework.runtime.extension.IGlobalExtension to achieve this, as Spock extensions have callbacks for both BEFORE all specs start, and AFTER all specs end.

public interface IGlobalExtension {
  void start();
  void visitSpec(SpecInfo spec);
  void stop();
}

So, implement stop() in your case to do whatever you need to do.

Spock finds extensions via Java's ServiceLoader , so make sure to add a META-INF/services file (pre-Java9) or declare it in your module-info.java file (post Java9), as explained here: http://spockframework.org/spock/docs/1.1/extensions.html#_writing_custom_extensions

One solution is to create an abstract class that all your specs extend:

class AbstractSpec extends Specification

then inside AbstractSpec find out the classes that are going to be run(for example if you're using spring framework):

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) }
}

then inside AbstractSpec do the actual clean up after all classes are run:

def synchronized cleanupSpec() {
    TEST_CLASSES.remove(getClass())
    if (TEST_CLASSES.isEmpty()) {
        // clean up here
    }
}

The problem with this solution is that if you run a subset of tests or classes in your IDE; you might have all the test classes in the classpath so TEST_CLASSES won't be emptied so the clean up won't execute.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM