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

rob*_*kuz 87 java testing gradle

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

System.getProperty("cassandra.ip");
Run Code Online (Sandbox Code Playgroud)

我有一个Gradle构建文件,我开始

gradle test -Pcassandra.ip=192.168.33.13
Run Code Online (Sandbox Code Playgroud)

要么

gradle test -Dcassandra.ip=192.168.33.13
Run Code Online (Sandbox Code Playgroud)

但是System.getProperty将始终返回null.

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

test {
    systemProperty "cassandra.ip", "192.168.33.13"
}
Run Code Online (Sandbox Code Playgroud)

我如何通过-D来做到这一点

Jef*_*rey 103

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

你可以test像你一样在你的块中使用systemProperty,但是通过传递给它-P来将它基于传入的gradle属性:

test {
    systemProperty "cassandra.ip", project.getProperty("cassandra.ip")
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你通过-D传递它

test {
    systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}
Run Code Online (Sandbox Code Playgroud)

  • 向“gradle.properties”添加默认值将防止“MissingPropertyException”。 (3认同)
  • 这对我不起作用(在Java代码中使用 System.getProperties().stringPropertyNames().forEach(System.out::println); 进行测试,它没有出现) (2认同)

小智 26

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

task integrationTest(type: Test) {
    useTestNG()
    options {
        systemProperties(System.getProperties())
    }
}
Run Code Online (Sandbox Code Playgroud)


avi*_*ivr 8

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

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

在这个例子中,只有PROP1并且PROP2将被传入,如果它们存在于gradle的JVM中.


Ero*_*ght 6

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

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

可以在命令行上传递:

 $ gradle intTest -Pfoo=1 -Pbar=2
Run Code Online (Sandbox Code Playgroud)

并在您的测试中检索:

String foo = System.getProperty("foo");
Run Code Online (Sandbox Code Playgroud)