如何通过Gradle和-D为我的测试提供System属性

时间:2014-01-28 13:02:03

标签: java testing gradle

我有一个读取系统属性的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

进行操作

6 个答案:

答案 0 :(得分:86)

-P标志用于gradle属性,-D标志用于JVM属性。因为测试可以在新的JVM中分叉,所以传递给gradle的-D参数不会传播到测试 - 听起来就像你看到的那样。

你可以像你一样使用test块中的systemProperty,但是将它作为传入的gradle属性,并将它传递给它-P:

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

或者,如果你通过-D

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

答案 1 :(得分:22)

碰到了这个非常大的问题,除了我不想再次在gradle脚本中列出命令行上给出的所有属性。因此,我将所有系统属性发送到我的测试

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

答案 2 :(得分:8)

I had a case where I needed to pass multiple system properties into the test JVM but not all (didn't want to pass in irrelevant ones). Based on the above answers, and by using subMap to filter the ones I needed, this worked for me:

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

In this example, only PROP1 and PROP2 will be passed in, if they exist in gradle's JVM.

答案 3 :(得分:3)

这是一个将众多项目属性作为系统属性传递给测试JVM的变体。我更喜欢项目属性而不是系统属性来增加灵活性。

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

可以在命令行上传递:

 $ gradle intTest -Pfoo=1 -Pbar=2

在你的测试中检索:

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

答案 4 :(得分:1)

这是对我有用的东西

//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);
    }
}

答案 5 :(得分: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'] 或< em> System.getProperty(“ env”),而输出(系统属性)存储在 systemProperties 数组中,可通过 systemProperties ['env'] 读取em>。