如何透过 Gradle 及-d 输入系统属性

我有一个读取 System 属性的 Java 程序

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 做到这一点

89059 次浏览

- P 标志表示 gradle 属性,-D 标志表示 JVM 属性。因为测试可能分叉在一个新的 JVM 中,所以传递给 gradle 的-D 参数不会传播到测试中-听起来就像您正在看到的行为。

您可以像以前一样使用 test块中的 system 属性,但是通过传递它来基于传入的 gradle 属性-P:

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'])
}

在这个例子中,只有 PROP1PROP2会被传入,如果它们存在于 gradle 的 JVM 中的话。

下面是一个变体,它将许多项目属性作为系统属性传递给测试 JVM。与系统属性相比,我更喜欢项目属性来增加灵活性。

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

它可以在命令行上传递:

 $ gradle intTest -Pfoo=1 -Pbar=2

并在测试中检索到:

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

所以我今天也偶然发现了这个问题,对我有用的是以下几点:

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

我正在使用 Penv = dev调用我的测试任务,并且在打印中得到了‘ dev’值,如果没有发送任何值,则得到‘ prod’,这是我所期望的行为。

值也可以在 java 端使用 GetProperty (“ env”)访问。

我对这个问题的结论是,输入值(参数)实际上存储在 系统下,可以通过 属性[‘ env’]GetProperty (“ env”)访问,而输出(系统属性)存储在 System 属性数组中,可以通过 SystemProperties [‘ env’]读取。

这个方法对我很管用

//in build.gradle file


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


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

假设您正在使用 TestNG,您可以添加如下所示的注释@Parameter

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