Як надати властивість System для мого тесту через Gradle та -D


103

У мене є програма 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 завжди поверне нуль .

Єдиний спосіб, який я знайшов, - це додати це в моєму файлі збірки Gradle через

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

Як це зробити через -D


1
Що відбувається при використанні gradle -Dcassandra.ip=192.168.33.13? У будь-якому випадку тестове завдання має один або кілька нових JVM. Тому вам доведеться чітко передавати властивості. Ніхто не змушує вас твердо кодувати їх значення у збірці.
JB Nizet

Також зверніть увагу на цей відповідь: stackoverflow.com/questions/23689054 / ...
IgalS

Відповіді:


123

Прапор -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")
}

1
Для мене це не працює (перевірено з використанням System.getProperties().stringPropertyNames().forEach(System.out::println);коду Java, він не з’являється)
CLOVIS

Попередження: getPropertyкидає, MissingPropertyExceptionякщо майно не знайдено. Відповідь Використовувати Ерон замість: stackoverflow.com/a/43112126/915441
Інгвар Крістіансен

1
Додавання значень за замовчуванням до gradle.propertiesзапобігатиме MissingPropertyException.
Данкан Калверт

Я не можу жодного з цих методів працювати. Що б я не робив, моя власність завжди є недійсною. Сюди входять і всі згадані нижче методи. Мені цікаво, чи це щось стосується більш нової версії, оскільки всі коментарі - з 2018 року? @CLOVIS Ви знайшли рішення для цього?
Хестер Ліон

@HesterLyons Мені хотілося знати, чи збірка тестується чи нормально працює, тому я використовував власне gradle властивості, яке додає під час тестування; Ви можете побачити код тут: github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/…
CLOVIS

27

З цією проблемою зіткнувся, за винятком того, що я не хочу знову перераховувати всі властивості, наведені в командному рядку в сценарії gradle. Тому я надсилаю всі властивості системи на мій тест

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

Будьте обережні, роблячи це. Це може легко зламати сучасні перевірки Gradle, коли властивості системи змінюються під час викликів.
Токуест

9

У мене був випадок, коли мені потрібно було передати декілька системних властивостей у тестовий JVM, але не всі (не хотіли передавати невідповідні). Виходячи з вищенаведених відповідей і використовуючи subMapдля фільтрації потрібні мені, це працювало для мене:

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

У цьому прикладі буде передано лише PROP1та PROP2, якщо вони існують у JVM Gradle.


5

Ось варіант, який передає численні властивості проекту тесту JVM як властивості системи. Я віддаю перевагу властивостям проектів перед властивостями системи для збільшення гнучкості.

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

Які можуть бути передані в командному рядку:

 $ gradle intTest -Pfoo=1 -Pbar=2

І отримано у вашому тесті:

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

Під час запуску System.getProperty("someprop")цього методу subMap я отримав {someprop=foo}замість цього foo. Мені довелося використовувати systemProperty "foo", project.properties.subMap(["foo"]).get("foo")в build.gradle
Інгвар Крістіансен

@YngvarKristiansen де (як) ви використовували systemProperty "foo"? тобто я прошу переглянути повний рядок коду, де це було використано? Я намагаюся все, що пропонується в цьому питанні, і досі Градле не передає жодних аргументів. Сподіваючись, це може вирішитись!
Хестер Ліон

@HesterLyons Вибачте, я не зберігав свій код, тому більше не знаю: \ Я згоден, що він виглядає поза місцем.
Інгвар Крістіансен

Дякую @YngvarKristiansen. З тих пір я розробив, що мою проблему викликав плагін junit gradle, який був включений у мій gradle.build. Дуже дивно.
Хестер Ліонс

0

Тому я сьогодні натрапив на це питання, і для мене це було наступне:

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

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

Значення також доступне на стороні java, використовуючи System.getProperty ("env") .

Мій висновок щодо цього полягає в тому, що вхідне значення (параметр) насправді зберігається під Системою , що робить його доступним через System.properties ['env'] або System.getProperty ("env") , тоді як вихід (властивість системи) зберігається в systemProperties масив, що робить його доступним для читання через systemProperties [ «окр»] .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.