GRADLE:TestNg - 无法将-D参数传递到Java代码

3
我有一个使用Java编写、利用TestNg并使用gradle构建的测试框架。我想在命令行传递一个“环境”参数,它将被用于Environment类中,以定义特定环境下的域和服务器值。尽管查阅了Gradle文档和多个论坛讨论此问题,但我仍无法将该参数作为系统属性传递给框架。我已经试过从“test”任务和“debug”任务两方面实现,但都没有成功。任务中的“println”语句表明-Denv参数已被Gradle捕获,但我试图将其添加到测试框架的System属性中却失败了。
执行结果显示出现了空引用,其中environmentName被设置为null。
请问有人能够找出我的错误吗?
命令行
.\gradlew debug -Denv=production

build.gradle

test {
    def environment = System.properties["env"]
    println environment
    systemProperties = System.getProperties()
    systemProperties['env'] = environment
    useTestNG()
}

task debug(type: Test) {
//    def environment = System.properties["env"]
//    println environment
//    systemProperties = System.getProperties()
//    systemProperties['env'] = environment
    def groupsToInclude = []
    def groupsToExclude = []

    groupsToInclude.add('under_development')
    useTestNG() {
        groupsToInclude.each { String group -> includeGroups group }
        groupsToExclude.each { String group -> excludeGroups group }
    }
}

Java类

import com.sun.javafx.runtime.SystemProperties;

public class Environment {

    private static EnvironmentDefinition environment;

    private Environment() {
    }

    public static EnvironmentDefinition getInstance() {
        if (environment == null) {
            String environmentName = SystemProperties.getProperty("env");
            // environmentName = environmentName == null ? "production" : environmentName;
            switch (environmentName) {
                default:
                    Environment.environment = ProductionEnvironment.getInstance();
            }
        }
        return environment;
    }
}

这可能会有所帮助...将此行添加到gradel shell脚本中的exec之前 - echo "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.launcher.GradleMain "$@"。下一行应该是exec。报告输出。 - Prashant
3个回答

3

一切都很顺利,请看我准备的演示。请注意,你不能将系统属性设置为null值-这可能也是一个问题。


Opal,感谢你提供的示例代码。最终导致了我的错误。 - CStockton
@Craig,如果您觉得有帮助,请至少点个赞。 - Opal
啊..我是一个在stackoverflow上提交/回复问题/答案的新手。你的答案已经被批准了。=0) - CStockton

1

"这是System,傻瓜...不是SystemProperties!...

总是那些最简单的疏忽引起最大的麻烦吗?

在克隆Opal的解决方案并将其与我的解决方案一起对齐,并逐步进行操作后,我注意到在java代码中,我的引用是SystemProperties.getProperty(),而不是System.getProperty()。

"

0
更好的解决方案可能是在您的.gradle/gradel.properties文件中添加属性,并将属性设置为适用于该机器的内容。看看这是否有效。例如,您可以在自己的机器上将其设置为DEV,但在其他机器上将其设置为BUILD。这样,您就不必每次都输入它。 请参阅有关根据环境自定义构建的问题。这种方法有优点和缺点。
希望这可以帮助到您。

除非我误解了,否则这种方法只适用于在被测试的机器上执行测试的情况。但是,在这种情况下,测试是在一个独立的机器(构建从属)上执行的,并且可以访问多个环境。在从属上构建和执行的测试代码需要知道要使用哪些URL和连接字符串,这取决于正在验证的环境。 - CStockton

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