Подтвердить что ты не робот

Как передать свойство System моему тесту через Gradle и -D

У меня есть Java-программа, которая читает свойство System

System.getProperty("cassandra.ip");

и у меня есть файл сборки Gradle, который я начинаю с

gradle test -Pcassandra.ip=192.168.33.13

или

gradle test -Dcassandra.ip=192.168.33.13

однако System.getProperty всегда будет возвращать null.

Единственным способом, который я нашел, было добавить это в мой файл сборки Gradle через

test {
    systemProperty "cassandra.ip", "192.168.33.13"
}

Как мне это сделать через -D

4b9b3361

Ответ 1

Флаг -P предназначен для свойств gradle, а флаг -D предназначен для свойств JVM. Поскольку тест может быть разветвлен в новом JVM, аргумент -D, переданный в gradle, не будет распространяться на тест - похоже, что это поведение, которое вы видите.

Вы можете использовать systemProperty в своем блоке test, как вы это сделали, но основываете его на входящем свойстве gradle, передавая его с ним -P:

test {
    systemProperty "cassandra.ip", project.getProperty("cassandra.ip")
}

или, альтернативно, если вы передаете его через -D

test {
    systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}

Ответ 2

В этой очень большой проблеме возникла проблема, за исключением того, что я не хочу снова перечислять все свойства, указанные в командной строке в gradle script. Поэтому я отправляю все свойства системы в свой тест

task integrationTest(type: Test) {
    useTestNG()
    options {
        systemProperties(System.getProperties())
    }
}

Ответ 3

У меня был случай, когда мне нужно было передать несколько системных свойств в тестовый JVM, но не все (не хотели пропускать нерелевантные). Основываясь на приведенных выше ответах, и используя subMap для фильтрации тех, которые мне нужны, это сработало для меня:

task integrationTest(type: Test) {
    // ... Do stuff here ...
    systemProperties System.getProperties().subMap(['PROP1', 'PROP2'])
}

В этом примере будут переданы только теги PROP1 и PROP2, если они существуют в gradle JVM.

Ответ 4

Здесь вариант, который передает множество свойств проекта тестовому JVM в качестве системных свойств. Я предпочитаю свойства проекта над свойствами системы, чтобы повысить гибкость.

task intTest(type: Test) {
    systemProperties project.properties.subMap(["foo", "bar"])
}

Что может быть передано в командной строке:

 $ gradle intTest -Pfoo=1 -Pbar=2

И получен в вашем тесте:

String foo = System.getProperty("foo");

Ответ 5

Поэтому сегодня я тоже наткнулся на этот вопрос, и у меня сработало следующее:

ext.env='prod'
test {
  systemProperty 'env', System.properties['env'] ?: "${env}"
  println "# test environment: " + systemProperties['env']
  ...
}

Я вызываю тестовое задание, используя -Penv = dev, и я получаю значение "dev" в своем распечатке или "prod", если я не отправляю никакого значения, что является ожидаемым для меня поведением.

Значение также доступно на стороне Java, используя System.getProperty("env").

Мой вывод по этому вопросу заключается в том, что входное значение (параметр) фактически хранится в System, делая его доступным либо через System.properties ['env'], либо через System.getProperty("env"), тогда как output (системное свойство) хранится в массив systemProperties, делающий его читаемым через systemProperties ['env'].