programing

Gradle 및 D를 통해 테스트에 시스템 속성을 부여하는 방법

copysource 2022. 9. 18. 16:11
반응형

Gradle 및 D를 통해 테스트에 시스템 속성을 부여하는 방법

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

System.getProperty("cassandra.ip");

그래들 빌드 파일이 있는데

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 경유로 하는 방법

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

에서 systemProperty를 사용할 수 있습니다.test지금까지와 같이 블록하지만, 수신 gradle 속성과 함께 전달함으로써 베이스로 합니다.

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

또는 D를 통해 전달하고 있는 경우

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

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

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

테스트 JVM에 여러 시스템 속성을 전달해야 하는 경우가 있었습니다(관련되지 않은 속성을 모두 전달하고 싶지 않았습니다).상기의 회답에 근거해, 다음의 방법으로subMap필요한 것을 필터링 할 수 있었습니다.

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

이 예에서는PROP1그리고.PROP2gradle의 JVM에 존재하는 경우 전달됩니다.

테스트 JVM에 수많은 프로젝트 속성을 시스템 속성으로 전달하는 변종입니다.유연성을 높이기 위해 시스템 속성보다 프로젝트 속성을 선호합니다.

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

이는 명령줄에서 전달될 수 있습니다.

 $ gradle intTest -Pfoo=1 -Pbar=2

테스트에서 검색된 항목:

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

여기 나에게 효과가 있었던 것이 있다.

//in build.gradle file

    tasks.withType(Test) {
        systemProperties = [
           ip: System.getProperty('ip', '192.168.33.13'),
        ]
    }

    task integrationTests(type: Test){
        useTestNG()
    }

TestNG를 사용하는 경우 다음과 같이 @Parameters 주석을 추가할 수 있습니다.

  public class IpAddress {
    @Test
    @Parameters("ip")
    public void printIpAddress(String ip) {
        System.out.println(ip);
    }
 }

이제 gradlew 명령을 실행할 수 있습니다.

./gradlew clean -Dip="xx.xx.xx.xx" integrationTests --tests "IpAddress"

@DataProvider를 사용하여 테스트 데이터를 통과하려면 다음과 같이 전달하고 위의 gradle 명령을 실행하여 테스트를 수행합니다.

 public class IpAddress {
    @DataProvider(name = "GetIP")
    private static Object[][] getIp() {
        return new Object[][]{
                //if -Dip is not provided in command, then by default it gets the value assigned in build.gradle file i.e.'192.168.33.13'
                {System.getProperty("ip")}, 
        };
    }

    @Test(dataProvider = "GetIP")
    public void printIpAddress(String ip) {
        System.out.println(ip);
    }
}

그래서 오늘도 그 문제에 대해 우연히 알게 되었습니다.그 결과, 다음과 같은 일이 잘 풀렸습니다.

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

-Penv=dev를 사용하여 테스트 작업을 호출하면 인쇄물에 'dev' 값이 표시되며, 값을 보내지 않으면 'dev' 값이 표시되며, 이것이 예상 동작입니다.

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

이 문제에 대한 저의 결론은 입력값(파라미터)은 실제로 System 아래에 저장되어 있기 때문에 어느 System을 통해서도 접근이 가능하다는 것입니다.properties['env']또는 System.getProperty("env")의 경우 출력(시스템 속성)은 systemProperties 배열에 저장되며 systemProperties['env']를 통해 읽을 수 있습니다.

언급URL : https://stackoverflow.com/questions/21406265/how-to-give-system-property-to-my-test-via-gradle-and-d

반응형