Не удалось прочитать набор системных переменных из файла GebConfig.groovy в файле спецификации - PullRequest
0 голосов
/ 17 мая 2018

Я использую 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 голосов
/ 19 мая 2018

Проблема в вашей переменной @Shared руководстве Geb говорится:

(...) объявляет поле @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 действительно только для очень дорогих ресурсов и очень исключительных случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...