Would it be useful to unroll all parameterized Spock tests automatically?
I’ve been always frustrated with the need to add @Unroll
annotation to every parameterized test/feature (or at least at the class/specification level) to make unrolling works in Spock. It was even worse to deal with the code with already missing @Unroll
annotations and cryptic test results. For backward compatibility unrolling will rather not be enabled by default in the foreseeable future, but luckily there is a quick solution.

Photo: Christopher Michel, CC BY 2.0
Unroll for all and for free
To enable global unrolling it is only required to add spock-global-unroll.jar
to your classpath:
testCompile 'info.solidsoft.spock:spock-global-unroll:0.5.0'
To make it easier to use spock-global-unroll with different Spock versions (like 1.0-groovy-2.0 and 1.0-groovy-2.3) the plugin does not have the compile dependency on Spock and a proper spock-core jar has to be explicitly defined in a build configuration. E.g.:
testCompile 'info.solidsoft.spock:spock-global-unroll:0.5.0' testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
That’s all. spock-global-unroll
is a global extension which is activated automatically by Spock. All parameterized Spock tests are unrolled without the need to use @Unroll
annotation.
Disabling automatic unrolling for a class
Automatic unrolling can be disabled for a particular class by putting @DisableGlobalUnroll
on it.
The nice thing is that the @Unroll
annotations manually placed at the test (feature) level can be used to unroll particular tests anyway (even if automatic unrolling has been disabled for given class).
@DisableGlobalUnroll class PeselValidatorSpec extends Specification { //one big test for multiple input parameters def "should not be unrolled for some reasons PESEL #number"() { ... } (...) }
Overriding default test name
To override default test name expanding (with #placeHolders
in a test name) @Unroll
annotation with a custom text can be used on the top of feature method or at the specification level.
@DisableGlobalUnroll class PeselValidatorSpec extends Specification { //one big test for multiple input parameters def "should not be unrolled for some reasons PESEL #number"() { ... } //unrolled anyway @Unroll("PESEL '#pesel' should be #description") def "should validate PESEL correctness"() { ... } (...) }
Summary
Being able to implement automatic tests unrolling within 15 minutes I decided to share it with the community – maybe there are others who don’t like to write boilerplate code :). The code written to achieve it has just a few lines of production code (of course there are also 3 test classes to verify if the extension works as expected :) ). This shows the power of Spock extensibility.
The complete source code is available from GitHub: https://github.com/szpak/spock-global-unroll
Update 20160521. I added automatic migration scripts in the project README to make a migration easier.
Btw, if you would like to find out more about “Interesting nooks and crannies of Spock” I will be speaking about them in May and June at GeeCON 2016 in Kraków, Gr8Conf 2016 in Copenhagen and Devoxx Poland again in Kraków.
Self promotion. Would you like to improve your and your team testing skills and knowledge of Spock quickly and efficiently? I conduct condensed (unit) testing training which you may find useful.