【问题标题】:GRADLE: TestNg - unable to pass -D parameter to java codeGRADLE:TestNg - 无法将 -D 参数传递给 java 代码
【发布时间】:2015-12-25 05:29:27
【问题描述】:

我有一个使用 TestNg 用 Ja​​va 编写的测试框架,并使用 gradle 构建。我想在命令行中传递一个“环境”参数,该参数将在环境类中用于定义特定环境的域和服务器值。使用 Gradle 文档和有关此问题的多个论坛讨论,我仍然无法将参数作为系统属性传递给框架。我试图从“测试”任务和“调试”任务中完成此任务,但无济于事。任务中的“println”语句显示 gradle 正在获取 -Denv 参数,但我尝试将其添加到测试框架的系统属性中失败。

执行导致空引用,并将 environmentName 设置为空。

有人可以识别我的错误吗?

命令行

.\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-script - echo "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.launcher.GradleMain "$@" 中将其添加为exec 之前的行。下一行应该是 exec。报告输出。

标签: java gradle testng command-line-arguments


【解决方案1】:

更好的解决方案可能是在您的.gradle/gradel.properties 文件中添加该属性,并将该属性设置为适用于该机器的内容。看看这是否有效。例如,您可能在您的机器上将其设置为DEV,但在另一台机器上设置为BUILD。这样您就不必每次都输入它。 请参阅有关customizing build by environment 的这个问题。这种方法有利有弊。

希望这会有所帮助。

【讨论】:

  • 除非我有误解,否则如果测试是在被测试的机器上执行的,这种方法就可以工作。在这种情况下,测试在单独的机器(构建从机)上执行,可以访问多个环境。在从属设备上构建和执行的测试代码需要根据正在验证的环境知道要使用哪些 url 和连接字符串。
【解决方案2】:

一切正常,请看我准备的demo。请注意,您 cannot 将系统属性设置为空值 - 这也可能是一个问题。

【讨论】:

  • Opal,感谢您提供示例代码。它最终导致了我的错误。
  • @Craig,如果你觉得它有帮助,请至少点赞。
  • 啊..新手在 stackoverflow 中提交/响应问题/答案。您的回答已被批准。 =0)
【解决方案3】:

“这是系统,你这个笨蛋...不是 SystemProperties!...

难道不是最简单的疏忽总是会造成最大的麻烦吗?

在将 Opal 的解决方案克隆到我的旁边,并一次将它们对齐后,我注意到在 java 代码中我的引用是 SystemProperties.getProperty(),而不是 系统.getProperty().

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2021-11-17
    • 2013-10-04
    • 2012-12-21
    • 2015-11-11
    • 2020-05-15
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多