2015-09-28 52 views
3

我有一个使用TestNg编写的Java测试框架,并使用gradle构建。我想在命令行传递一个'environment'参数,这个参数将在Environment类中用于定义特定环境的域和服务器值。在这个问题上使用Gradle文档和几个论坛讨论,我仍然无法将作为系统属性传递给框架的参数。我试图从“测试”任务和“调试”任务中完成此操作,但无济于事。任务中的'println'语句显示Gradle正在拾取-Denv参数,但我尝试将其添加到测试框架的System属性失败。GRADLE:TestNg - 无法将-D参数传递给java代码

执行结果为null引用,其中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; 
    } 
} 
+0

这可能有助于...添加这是在gradel shell-sc中'exec'之前的那行ript - 'echo“$ JAVACMD”“$ {JVM_OPTS [@]}”-classpath“$ CLASSPATH”org.gradle.launcher.GradleMain“$ @” '。下一行应该是exec。报告输出。 – Prashant

回答

3

这一切运作良好,请看看我准备的demo。注意事实,你cannot设置系统属性为空值 - 这也可能是一个问题。

+0

欧泊,谢谢你的示例代码。它最终导致我的错误。 – CStockton

+0

@克雷格,如果你觉得它有帮助,请至少补充它。 – Opal

+0

Ah..newbie提交/回复问题/答案在stackoverflow。你的答案已被批准。 = 0) – CStockton

0

一个更好的解决方案可能是添加属性在.gradle/gradel.properties文件,然后使用属性集适用于那台机器。看看是否有效。例如,您可以在您的机器上将其设置为DEV,但在另一台机器上可以将其设置为BUILD。这样你就不必每次都进入它。 看到这个问题关于customizing build by environment。这种方法有优点和缺点。

希望这会有所帮助。

+0

除非我误解,如果测试正在被测试的机器上执行,这种方法将工作。在这种情况下,测试正在独立的机器上执行(构建从机),并可访问多个环境。在从站上构建和执行的测试代码需要根据所验证的环境知道要使用哪些URL和连接字符串。 – CStockton

+0

好的,在这种情况下,你需要传递一个命令行参数。 – Prashant

1

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

是不是总是最简单的疏忽造成的最麻烦的?

克隆欧泊的沿边矿山解决方案后,并带领他们进入对准一步一步的时候,我注意到,在Java代码中我参照的是SystemProperties .getProperty(),而不是系统 .getProperty()。