2012-06-05 104 views
2

我有一個只包含Selenium/TestNG測試類的gradle項目。它們是針對部署的戰爭應用程序執行的。所有工作正常,現在我添加一個Java實用程序,它將查詢測試基礎並打印屬於給定TestNG組的測試列表。該實用程序應該與主項目分開編譯和執行,因爲用戶可能希望在測試執行之前查詢測試基礎。如何在主項目外編譯Gradle中的單個類依賴項

我增加了以下內容的build.gradle:

task listgroups(dependsOn:'buildUtil') <<{ 
    ant.java(classname: 'util.TestGroupScanner', fork: true, 
      classpath: "src/test/java") 
} 

task buildUtil { 
    compile { 
     source = "src/test/java/util" 
    } 
} 

但是,調用listgroups任務的時候,我發現了以下錯誤:

C:\console-bg1>g listgroups 

FAILURE: Build failed with an exception. 
(...) 

* What went wrong: 
A problem occurred evaluating root project 'console-bg1'. 
> Could not find method compile() for arguments [build_4emu7duna2isgubc1k8uts8k9 
[email protected]] on root project 'console-bg1'. 

我不知道如何解決這個問題並且不用多說,到目前爲止還沒有在網上找到答案。任何指針讚賞。

回答

2

問題出在buildUtil任務上,如錯誤所示。 buildUtil聲明瞭一個compile閉包,但這種閉包對於缺省任務不存在。

讓我試着澄清你的設置是什麼。 util.TestGroupScanner源文件位於src/test/java/util目錄中,該目錄要與其他源(可能爲src/main/javasrc/test/java)分開編譯。 buildUtil任務應該編譯src/test/java/util中的源代碼,並且listgroups任務在源文件夾src/test/java上執行掃描程序實用程序。

在這種情況下,我建議你申報你的水電費源新source set,就像這樣:

sourceSets { 
    util { 
    java { 
     srcDir 'src/test/java/util' 
    } 
    } 
} 

這將自動創建一個名爲compileUtilJava爲您編譯任務,這將彙編這些來源。我還認爲在執行工具時,您會希望在類路徑中包含實用程序類,該工具可以通過sourceSets.util.output.classesDir進行檢索。所以,現在你的任務listgroups的樣子:

task listgroups(dependsOn: 'compileUtilJava') <<{ 
    ant.java(classname: 'util.TestGroupScanner', fork: true, 
      classpath: "src/test/java:" + sourceSets.util.output.classesDir) 
} 

有一件事我已經注意到你的設置,是src/test/java/util源文件夾src/test/java下嵌套。 Gradle會假設src/test/java是您的項目測試的默認文件夾,因此會在運行測試時自動將其包含在其所有子項中。既然你想保持你的實用程序文件夾與默認設置分開,我建議你把它放在src/testutil/java,以避免任何衝突。如果這樣做,不要忘記使用正確的源路徑更新sourceSets設置。

+0

謝謝你的詳細信息。現在我對Gradle的工作原理有了更好的理解......您是對的,我需要將util移出test/java目錄結構。感謝您指出這一點。我將你的sourceSet定義與另一個響應中的JavaExec結合起來,它可以工作。 – Lidia

0

爲了解決這個問題,我建議爲你的util類創建一個特定的源代碼集,並添加一個JavaExec類型的任務來執行這個類來打印你的testng組。看一看下面的代碼片段:

apply plugin:'java' 
... 
... 
configurations{ 
    testUtilCompile.extendsFrom testCompile 
} 

... 
... 
sourceSets{ 
    testUtil{ 
     java { 
      srcDir "src/test/java" 
      include "util/**" 
     } 
    } 
} 

task printGroups(type:JavaExec){ 
    main = "util.TestGroupScanner" 
    classpath = sourceSets.testUtil.runtimeClasspath 
} 

問候, 勒

+0

謝謝!奇蹟般有效。 – Lidia

相關問題