大多数情况下,似乎spock测试都是以相同的顺序执行的。
是否可以设置一些选项以随机顺序执行它们?
更新:正如tim_yates所说:“测试应该隔离,顺序无关紧要”,我想我应该解释一下我为什么要拥有此功能...
我们进行了一次代码撤退,试图将测试变成绿色。因此,我们在被测类中实现了一个状态,然后将其用于返回所有测试的corerct结果。
为了避免这种邪恶的编码,我认为最好以随机顺序执行测试:-)
答案 0 :(得分:6)
在提出Leonard Brünings建议之后,我已使用注释驱动的扩展替换了基于扩展
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
注释(请参阅"Annotation-Driven Local Extension"文档)。首先,我们创建一个注释类。
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
注释的测试时,我们将看到与声明顺序不同的方法。
答案 1 :(得分:5)
由于您只想随机化一个类中的测试顺序,因此可以通过扩展来实现。看看StepwiseExtension
private void sortFeaturesInDeclarationOrder(SpecInfo spec) {
for (FeatureInfo feature : spec.getFeatures())
feature.setExecutionOrder(feature.getDeclarationOrder());
}
您可以在自己的扩展名中随意随机化执行顺序。取决于您是只选择还是全部测试。您可以创建AnnotationDrivenExtension
或IGlobalExtension
,请参见docs,以了解其工作原理。