如何设置在要素方法之间不重新评估的全局变量

时间:2018-10-25 17:27:51

标签: spock geb

我有一个示例脚本,如下所示:

@Stepwise
class RandomTest extends GebReportingSpec {


    @Shared
    Random random = new Random()
    def tag = random.nextInt(999)+1

    def setupSpec() {
        new File('/ProgramData/geb.properties').withInputStream {
            properties.load(it)
        }
    }

    def "Random Test"(){
        when:
        println("Random1: ${tag}")
        println("Random2: ${tag}")
        then:
        Thread.sleep(1000)
    }

    def "Random test2"(){
        when:
        println("Random3: ${tag}")
        then:
        Thread.sleep(1000)
    }
}

在此示例中,Random1和Random 2打印相同的数字,而Random 3打印不同的数字。

例如,这是我运行代码时的输出:

Random1: 528
Random2: 528
Random3: 285

我认为这是因为在要素方法之间重新评估了共享变量。我尝试将这些变量声明移到@Shared注释之外,但无济于事。

我想要它,以便在规范开始时生成随机标记变量,并且希望它保留其值,但是我不确定如何设置全局变量来执行此操作。我需要实例化setupSpec内部的变量吗?

2 个答案:

答案 0 :(得分:2)

在测试之间重新评估

@Shared变量。观察的原因是您输出的不是@Shared变量tagrandom.nextInt(999)+1会在每种测试方法之前进行评估。

如果在@Shared上放置tag,则值将保持不变。

答案 1 :(得分:0)

看起来像从设置规范中实例化变量是可行的:

@Shared
def tag
def setupSpec() {
    new File('/ProgramData/geb.properties').withInputStream {
        properties.load(it)
    }
    Random random = new Random()
    tag = random.nextInt(999)+1
}

def "Random Test"(){
    when:
    println("Random1: ${tag}")
    println("Random2: ${tag}")
    then:
    Thread.sleep(1000)
}

def "Random test2"(){
    when:
    println("Random3: ${tag}")
    then:
    Thread.sleep(1000)
}