Как передать свойство 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
Ответы
Ответ 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'].