После предложения Леонарда Брюнингса я заменил решение, основанное на расширении Sputnik
, на использование расширения, управляемого аннотациями.
Вы можете создать свое собственное расширение Spock, которое рандомизирует функции.Рассмотрим следующий пример.
package com.github.wololock
import spock.lang.Specification
@RandomizedOrder
class RandomSpockSpec extends Specification {
def "test 1"() {
when:
def number = 1
then:
println "[${new Date().format("HH:mm:ss.SSS")}] number ${number}"
}
def "test 2"() {
when:
def number = 2
then:
println "[${new Date().format("HH:mm:ss.SSS")}] number ${number}"
}
def "test 3"() {
when:
def number = 3
then:
println "[${new Date().format("HH:mm:ss.SSS")}] number ${number}"
}
def "test 4"() {
when:
def number = 4
then:
println "[${new Date().format("HH:mm:ss.SSS")}] number ${number}"
}
def "test 5"() {
when:
def number = 5
then:
println "[${new Date().format("HH:mm:ss.SSS")}] number ${number}"
}
}
src / test / groovy / com / github / wololock / RandomSpockSpec.groovy
Эта спецификация содержит 5 функций, которые печатают числа на консоли.Мы используем пользовательскую аннотацию @RandomizeOrder
(см. «Локальное расширение на основе аннотаций» документы).Во-первых, мы создаем класс аннотаций.
package com.github.wololock
import org.spockframework.runtime.extension.AbstractAnnotationDrivenExtension
import org.spockframework.runtime.model.SpecInfo
final class RandomizedOrderExtension extends AbstractAnnotationDrivenExtension<RandomizedOrder> {
public static final String SPOCK_RANDOM_ORDER_SEED = "spock.random.order.seed"
private static final long seed = System.getProperty(SPOCK_RANDOM_ORDER_SEED)?.toLong() ?: System.nanoTime()
static {
println "Random seed used: ${seed}\nYou can re-run the test with predefined seed by passing -D${SPOCK_RANDOM_ORDER_SEED}=${seed}\n\n"
}
@Override
void visitSpecAnnotation(RandomizedOrder annotation, SpecInfo spec) {
final Random random = new Random(seed)
final List<Integer> order = (0..(spec.features.size())) as ArrayList
Collections.shuffle(order, random)
spec.features.each { feature ->
feature.executionOrder = order.pop()
}
}
}
src / test / groovy / com / github / wololock / RandomizedOrderExtension.groovy
Это расширение делает одну вещь - в методе посетителя visitSpec
мы назначаем случайный порядок выполнения для всех методов объектов.Он поддерживает предопределенный начальный уровень, поэтому всякий раз, когда вы захотите воссоздать определенный заказ, вы можете прочитать начальное значение из консоли и передать его при следующем запуске.Например, следующий добавленный параметр -Dspock.random.order.seed=1618636504276
будет перетасовывать объекты с использованием предопределенного начального числа.
Когда мы запустим тест, помеченный @RandomizedOrder
, мы увидим методы в порядке, отличном от порядка объявления.