如何使用Gradle test将命令行参数传递给测试?

18

我正在使用Gradle运行JUnit测试。问题是我需要从命令行传递参数到测试中。我尝试了传递系统属性但失败了。

gradle test -Darg1=something

这是我的测试:

public class MyTest {
    @Test
    public void someTest() throws Exception {
        assertEquals(System.getProperty("arg1"), "something");
    }
}

它失败是因为没有arg1参数。 是否可能以某种方式传递命令行参数?

2个回答

22
当你运行gradle test -Darg1=smth时,你将系统参数arg1传递给Gradle JVM,而不是运行测试的测试JVM。这样设计是为了保护测试免受副作用的影响。
如果您需要将参数传播到测试中,请使用类似以下方式:
test {
    systemProperty 'arg1', System.getProperty('arg1')
}

并以相同的方式运行它。


我应该把test{ systemProperty 'arg1', System.getProperty('arg1')}脚本放在哪里?我收到了这个错误:“找不到方法test for arguments()”。 - Apperside
1
@Apperside 请查看此链接 https://github.com/cuba-platform/cuba/blob/master/build.gradle#L391 - AdamSkywalker
@ Apperside 将这段文本放入 build.gradle 文件中。 - Big Al
你如何设置一个默认值,可以从命令行覆盖? - red888
当我在我的Gradle文件中添加如上所述的测试方法时,我遇到了错误,提示“无法找到类型为'android'的扩展程序上的参数的test()方法”,这是最近更新的吗? - krishna5688
这对我在Gradle Kotlin DSL上有效!更改build.gradletasks.test { systemProperty("arg1", System.getProperty("arg1") ?: "default value") }然后在CLI中传递参数:./gradlew build test -Darg1=value - Bruno Pereira

20

使用“-D”来传递参数,如下所示:

./gradlew test -Dgrails.env=dev -D<yourVarName>=<yourValue>

查看 gradle命令行文档 以了解-D。

要在测试中访问它,您需要在build.gradle文件中传播它。

    test {
       systemProperty "propertyName", "propertyValue"
    }

您还可以这样传递所有的系统属性:

    test {
        systemProperties(System.getProperties())
    }

我误读了OP的问题,在刷新页面查看您的答案之前进行了编辑。 - ninnemannk
他的答案中还包括“所有系统属性”的选项,而你的答案中却没有。 - zeusalmighty
你能否在Java代码中使用System.getProperties('yourVarName')来获取通过命令行传递的yourValue - payne
当我在我的Gradle文件中添加上述测试方法时,我收到了一个错误,提示“找不到类型为'android'的扩展名上的参数的test()方法”,这是最近更新的吗? - krishna5688

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接