首页 文章

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

提问于
浏览
59

我有一个读取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 将始终返回 null .

我找到的唯一方法是在我的Gradle构建文件中添加它

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

我怎么做通过-D

4 回答

  • 66

    -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")
    }
    
  • 6

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

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

    我有一个案例,我需要将多个系统属性传递给测试JVM但不是全部(不想传递不相关的) . 基于上述答案,并使用 subMap 来过滤我需要的答案,这对我有用:

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

    在此示例中,如果它们存在于gradle的JVM中,则只传入 PROP1PROP2 .

  • 2

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

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

    可以在命令行上传递:

    $ gradle intTest -Pfoo=1 -Pbar=2
    

    并在您的测试中检索:

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

相关问题