我正在使用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
}
}
你能帮我解决一下如何做到这一点,因为这对我来说非常重要,可以在变量中访问和存储它。感谢
答案 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
实际上仅用于非常昂贵的资源和非常特殊的情况。