您如何设置不会在特征方法之间重新评估的全局变量

How do you set global variables that don't get re-evaluated between feature methods

我的示例脚本如下所示:

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

在此示例中,随机 1 和随机 2 打印相同的数字,但随机 3 打印不同的数字。

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

Random1: 528
Random2: 528
Random3: 285

我假设这是因为共享变量在特征方法之间被重新计算。我曾尝试将这些变量声明移到 @Shared 注释之外,但无济于事。

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

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

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

@Shared 变量在测试之间 重新评估。你观察的原因是你输出了not @Shared变量tagrandom.nextInt(999)+1 在每个测试方法之前进行评估。

如果你把 @Shared 放在 tag 上,值不会改变。