You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Geb Spock无法读取GebConfig.groovy设置的系统变量,求助解决方案

问题分析

你的问题核心在于**@Shared变量的初始化时机早于GebConfig.groovy的执行时机**。当Spock初始化你的TC001_SMO_Scenario_Spec类时,被@Shared修饰的lang变量会立刻执行System.getProperty("geb.env.lang"),但此时Geb框架还未加载并执行GebConfig中的代码——那些System.setProperty的逻辑要等到Geb启动后才会运行,所以自然返回null。


解决方案1:在测试方法/初始化阶段获取变量

把变量的获取逻辑从@Shared移到测试方法内部,或者放到setup()方法(每个测试方法执行前运行)中。此时GebConfig已经执行完毕,系统变量已经被正确设置:

@Stepwise
class TC001_SMO_Scenario_Spec extends GebReportingSpec {
    def lang // 移除@Shared修饰

    def setup() {
        // 测试执行前获取变量,此时GebConfig已完成初始化
        lang = System.getProperty("geb.env.lang")
    }

    def "Step 1: Perform Login"() {
        when: "Load File"
        to WUPage

        then: "File loaded successfully"
        println "Getting data from Geb Config File: " + lang
    }
}

解决方案2:直接引用GebConfig中的配置变量

如果你希望在Spec中直接访问GebConfig的配置,可以把GebConfig里的envLang改为全局可访问的变量:

修改GebConfig.groovy:

def final DEFAULT_BROWSER = "chrome"
def final DEFAULT_LANGUAGE = "nl" //"en" or "nl"

// 改为全局可访问的变量(去掉局部def限制)
envLang = System.getProperty("geb.env.lang")
if (!correctLanguage(envLang)) {
    envLang = DEFAULT_LANGUAGE
}

browser = System.getProperty("geb.env")
if (!correctBrowser(browser)) {
    browser = DEFAULT_BROWSER
}

System.setProperty("geb.env.lang", envLang)
System.setProperty("geb.env", browser)

environments {
    driver = { getDriver(browser, envLang) }
}

然后在Spec中直接引用:

@Stepwise
class TC001_SMO_Scenario_Spec extends GebReportingSpec {
    def "Step 1: Perform Login"() {
        when: "Load File"
        to WUPage

        then: "File loaded successfully"
        // 通过geb.config访问GebConfig中的变量
        def lang = geb.config.envLang
        println "Getting data from Geb Config File: " + lang
    }
}

解决方案3:使用Geb内置的配置API

Geb本身提供了访问当前环境配置的API,你可以通过browser.config直接获取相关设置:

@Stepwise
class TC001_SMO_Scenario_Spec extends GebReportingSpec {
    def "Step 1: Perform Login"() {
        when: "Load File"
        to WUPage

        then: "File loaded successfully"
        // 从browser的原始配置中获取语言变量
        def lang = browser.config.rawConfig.envLang
        println "Getting data from Geb Config File: " + lang
    }
}

小提示

尽量避免在@Shared或类初始化阶段获取Geb相关配置,因为此时Geb框架还未完成初始化。优先选择在测试方法内部、setup()或setupSpec()方法中获取配置变量。

内容的提问来源于stack exchange,提问作者Durgesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:23