我有一个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实现
7条答案
按热度按时间chhqkbe11#
-P标志用于gradle属性,-D标志用于JVM属性。因为测试可能会在新的JVM中分叉,所以传递给gradle的-D参数不会传播到测试-听起来这就是您看到的行为。
你可以在你的
test
块中使用systemProperty,但它是基于传入的gradle属性的,方法是将它与-P一起传递:或者,如果您通过-D传递它
bzzcjhmw2#
遇到了这个非常多的问题,除了我不想再次列出gradle脚本中命令行上给出的所有属性。因此,我将所有系统属性发送到我的测试
q5lcpyga3#
我曾经遇到过这样的情况,我需要将 * 多个 * 系统属性传递到测试JVM中,但不是 * 所有 *(不想传递不相关的属性)。基于上面的答案,并使用
subMap
来过滤我需要的,这对我来说很有效:在这个例子中,只有
PROP1
和PROP2
会被传入,如果它们存在于gradle的JVM中。uttx8gqw4#
下面是一个变体,它将大量项目属性作为系统属性传递给测试JVM。为了增加灵活性,我更喜欢项目属性而不是系统属性。
它可以在命令行上传递:
并在测试中检索到:
ctrmrzij5#
所以我今天也遇到了这个问题,对我有效的是以下几点:
我使用 -Penv=dev 调用我的测试任务,并在打印中获得'dev'值,如果我不发送任何值,则为'prod',这是我的预期行为。
在java端也可以使用 System.getProperty(“env”) 访问值。
我的结论是,输入值(参数)实际上存储在 System 下,可以通过 System.properties ['env'] 或 System.getProperty(“env”) 访问,而输出(系统属性)存储在 systemProperties 数组中,可以通过 systemProperties ['env'] 读取。
k0pti3hp6#
我有个办法
假设您正在使用TestNG,您可以添加注解@Parameters,如下所示
现在可以执行gradlew命令了
如果你想使用@DataProvider来传递测试数据,你可以像下面这样传递,并执行上面相同的gradle命令来运行测试
eyh26e7m7#
在我的例子中,我需要通过系统属性将github token传递给测试。
我试过这个:
但是给予我一个错误,所以a传递了一个默认值: