2015-09-28 49 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()。