【问题标题】:Not able to read the system variable set from GebConfig.groovy file in spec file无法从规范文件中的 GebConfig.groovy 文件中读取系统变量集
【发布时间】:2018-10-27 15:51:18
【问题描述】:

我正在使用 geb spock。我正在尝试从 GebConfig 文件中读取系统变量,但是它返回 null 值。

下面是我的 GebConfig.groovy 文件。

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

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

def envLang = System.getProperty("geb.env.lang")
//Default language
if (!correctLanguage(envLang)) {
    envLang = DEFAULT_LANGUAGE
}

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

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

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

下面是我试图在变量中获取语言值的规范文件。

@Stepwise
class TC001_SMO_Scenario_Spec extends GebReportingSpec {


    @Shared
    def 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

    }

}

你能帮我怎么做吗,因为这对我访问并将其存储在变量中非常重要。谢谢

【问题讨论】:

  • 我不知道为什么,但是我所有的 GebConfigs 都在 setProperty 中调用 getProperty: System.setProperty("geb.env.lang", System.getProperty("geb.env.lang", envLang ))

标签: groovy spock geb


【解决方案1】:

问题在于您的 @Shared 变量。 Geb manual 说:

(...) 声明一个@Shared 字段。同样,最好在声明时初始化该字段。 (语义上,这相当于在setupSpec() 方法的最开始初始化字段。)

问题是,setupSpec() 运行 之前 GebConfig 被评估。如果您将其添加到 GebConfig 的末尾,您可以看到它:

println "Finished evaluating GebConfig"

然后运行这个 Geb 规范(我已经将变量赋值包装到闭包中并添加了打印语句,然后我正在评估闭包以使赋值起作用):

package de.scrum_master.stackoverflow

import geb.spock.GebReportingSpec
import spock.lang.Shared

class GebConfigIT extends GebReportingSpec {
  @Shared
  def sharedLang = {
    println "Initialising sharedLang"
    System.getProperty("geb.env.lang")
  }()

  def normalLang = {
    println "Initialising normalLang"
    System.getProperty("geb.env.lang")
  }()

  def setup() {
    println "sharedLang = $sharedLang"
    println "normalLang = $normalLang"
  }

  def foo() {
    expect:
    !sharedLang
    normalLang
  }

  def bar() {
    expect:
    !sharedLang
    normalLang
  }
}
Initialising sharedLang

Finished evaluating GebConfig
Initialising normalLang
sharedLang = null
normalLang = nl

Initialising normalLang
Finished evaluating GebConfig
sharedLang = null
normalLang = nl

你能看到sharedLang 是如何在一开始只初始化一次,甚至在GebConfig 有机会启动之前吗?

底线:只需从您的代码中删除 @Shared。无论如何,大多数人都过度使用它,他们认为这样可以节省时间来获取廉价资源并篡改干净的夹具设置。 @Shared 真的只适用于非常昂贵的资源和非常特殊的情况。

【讨论】:

  • 虽然您的回答是正确的,因为它将解决 OP 的问题并将变量设置为GebConfig.groovy 中设置的系统属性,但我认为在其中设置系统属性是一个坏主意。然后,您最终必须仅在评估 GebConfig.groovy 之后读取系统属性,并且在我看来,它发生的时间是 GebSpecBrowser 的实现细节。很难理解 OP 试图对语言值做什么,因此很难提出更好的解决方案。
  • 不反对您认为这不是一个好主意。我只是想回答这个问题。无论他想对语言信息做什么(他也可能以某种方式从浏览器实例中获取它,我没有检查),它可能很有用。毕竟,我从 Geb 中引用的生命周期信息很好地解释了为什么这些信息可用于普通实例成员,但不适用于共享成员。所以使用它似乎是安全的。
  • 感谢 kriegaex 和 erdi。当我删除 @Shared 标记时,发现它有效。我计划在运行时获取语言名称,并根据我的测试数据属性文件的名称连接字符串。这就是我想从 GebConfig 文件中读取它的原因。感谢您对此的帮助
猜你喜欢
  • 2018-01-25
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多