java 如何通过Gradle和-D将System属性赋予我的测试

pdtvr36n  于 2023-05-15  发布在  Java
关注(0)|答案(7)|浏览(245)

我有一个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
我发现的唯一方法是通过

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

如何通过-D实现

chhqkbe1

chhqkbe11#

-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")
}
bzzcjhmw

bzzcjhmw2#

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

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

q5lcpyga3#

我曾经遇到过这样的情况,我需要将 * 多个 * 系统属性传递到测试JVM中,但不是 * 所有 *(不想传递不相关的属性)。基于上面的答案,并使用subMap来过滤我需要的,这对我来说很有效:

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

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

uttx8gqw

uttx8gqw4#

下面是一个变体,它将大量项目属性作为系统属性传递给测试JVM。为了增加灵活性,我更喜欢项目属性而不是系统属性。

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

它可以在命令行上传递:

$ gradle intTest -Pfoo=1 -Pbar=2

并在测试中检索到:

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

ctrmrzij5#

所以我今天也遇到了这个问题,对我有效的是以下几点:

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

我使用 -Penv=dev 调用我的测试任务,并在打印中获得'dev'值,如果我不发送任何值,则为'prod',这是我的预期行为。
在java端也可以使用 System.getProperty(“env”) 访问值。
我的结论是,输入值(参数)实际上存储在 System 下,可以通过 System.properties ['env']System.getProperty(“env”) 访问,而输出(系统属性)存储在 systemProperties 数组中,可以通过 systemProperties ['env'] 读取。

k0pti3hp

k0pti3hp6#

我有个办法

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

eyh26e7m7#

在我的例子中,我需要通过系统属性将github token传递给测试。
我试过这个:

systemProperty "github.token", System.getProperty("github.token")

但是给予我一个错误,所以a传递了一个默认值:

ext.github_token='TOKEN'
test {
    systemProperty 'github.token', System.properties['github.token'] ?: "${github_token}"
}

相关问题