Gradle 및 -D를 통해 내 테스트에 시스템 속성을 제공하는 방법


103

시스템 속성을 읽는 Java 프로그램이 있습니다.

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
사용하면 gradle -Dcassandra.ip=192.168.33.13어떻게 되나요? 어쨌든 테스트 작업은 하나 또는 여러 개의 새 JVM을 포크합니다. 따라서 속성을 명시 적으로 전달해야합니다. 하지만 그 누구도 빌드에서 값을 하드 코딩하도록 강요하지 않습니다.
JB Nizet 2014 년

또한이 답변을 살펴보십시오 : stackoverflow.com/questions/23689054/…
IgalS dec.

답변:


123

-P 플래그는 gradle 속성 용이고 -D 플래그는 JVM 속성 용입니다. 테스트가 새 JVM에서 분기 될 수 있기 때문에 gradle에 전달 된 -D 인수는 테스트로 전파되지 않습니다. 이는 사용자가보고있는 동작 인 것처럼 들립니다.

test했던 것처럼 블록 에서 systemProperty를 사용할 수 있지만 -P와 함께 전달하여 들어오는 gradle 속성을 기반으로 할 수 있습니다.

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);자바 코드에서, 그것은 표시되지 않습니다)
클로 비스

경고 : getProperty던졌습니다 MissingPropertyException속성이 발견되지 않는 경우. 대신 사용 Eron의 대답 : stackoverflow.com/a/43112126/915441
Yngvar Kristiansen이

1
에 기본값을 추가 gradle.properties하면 MissingPropertyException.
Duncan Calvert

이 방법 중 어느 것도 작동하지 않습니다. 내가 무엇을하든 myProperty는 항상 null입니다. 여기에는 아래에 언급 된 모든 방법도 포함됩니다. 모든 댓글이 2018 년의 것이므로 이것이 최신 버전과 관련이 있는지 궁금합니다. @CLOVIS에 대한 해결책을 찾았습니까?
Hester Lyons 19 년

난 단지 원하는 @HesterLyons 알고하는 경우 빌드가 실행 일반적으로 테스트하거나 한 내가 테스트 할 때 자체 추가 속성 Gradle을 사용하므로; 여기에 코드를 볼 수 있습니다 github.com/CLOVIS-AI/wildfyre-java/blob/master/src/main/java/...
클로비스

27

gradle 스크립트의 명령 줄에 주어진 모든 속성을 다시 나열하고 싶지 않다는 점을 제외 하고는이 문제가 많이 발생했습니다. 따라서 모든 시스템 속성을 테스트에 보냅니다.

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

이 작업을 수행 할 때주의하십시오. 호출 중에 시스템 속성이 변경되면 Gradle의 최신 검사를 쉽게 중단 할 수 있습니다.
thokuest

9

내가 전달하는 데 필요한 경우 한 여러 테스트 JVM하지만에 시스템 속성을 모든 (관련이없는 사람에 통과하고 싶지 않았다)를. 위의 답변을 바탕으로 subMap필요한 항목을 필터링하는 데 사용하면 다음과 같은 효과가 있습니다.

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

이 예에서는 gradle의 JVM에 존재하는 경우 에만 PROP1PROP2전달됩니다.


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에
Yngvar Kristiansen이에게

@YngvarKristiansen 어디서 (어떻게) 사용하고 계 systemProperty "foo"셨습니까? 즉, 이것이 사용 된 코드의 전체 라인을 보도록 요청하고 있습니까? 나는이 질문에서 제안 된 모든 것을 시도하고 있으며 여전히 Gradle은 어떤 주장도 전달하지 않습니다. 이것이 해결되기를 바랍니다!
Hester Lyons 19 년

@HesterLyons 죄송합니다. 코드를 보관하지 않았기 때문에 더 이상 알 수 없습니다.
Yngvar Kristiansen

@YngvarKristiansen 감사합니다. 그 이후로 내 문제가 내 gradle.build에 포함 된 junit gradle 플러그인으로 인해 발생한다는 것을 알아 냈습니다. 매우 이상합니다.
Hester Lyons 19

0

그래서 오늘도 그 문제를 우연히 발견했고 저에게 효과가 있었던 것은 다음과 같습니다.

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

-Penv = dev를 사용하여 테스트 작업을 호출 하고 있으며 인쇄에서 'dev'값을 얻거나 값을 보내지 않으면 'prod'를 얻습니다.

값은 System.getProperty ( "env")를 사용하여 Java 측에서도 액세스 할 수 있습니다 .

문제에 대한 내 결론은 입력 값 (매개 변수)이 실제로 System 아래에 저장되어 System.properties [ 'env'] 또는 System.getProperty ( "env")를 통해 액세스 할 수 있도록하는 반면 출력 (시스템 속성)은 systemProperties를 통해 읽을하게 배열 systemProperties [ 'ENV'] .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.