无法从spec文件中的GebConfig.groovy文件中读取系统变量集

时间:2018-05-17 11:33:06

标签: groovy spock geb

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

以下是我的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) }
}

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

@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

    }

}

你能帮我解决一下如何做到这一点,因为这对我来说非常重要,可以在变量中访问和存储它。感谢

1 个答案:

答案 0 :(得分:2)

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

  

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

问题是,setupSpec()在评估 GebConfig之前运行。如果您将其添加到GebConfig

的末尾,则可以看到它
println "Finished evaluating GebConfig"

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

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实际上仅用于非常昂贵的资源和非常特殊的情况。