我有一个gradle项目,只包含Selenium / TestNG测试类。它们针对已部署的war应用程序执行。一切正常,现在我正在添加一个java实用程序,它将查询测试库并打印属于给定TestNG组的测试列表。该实用程序应该与主项目分开编译和执行,因为用户可能希望在测试执行之前查询测试库。
我在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
8$_run_closure6_closure11@d210ab] on root project 'console-bg1'.
我不知道如何解决这个问题,不用说,到目前为止还没有在网上找到答案。任何指针都赞赏。
答案 0 :(得分:2)
问题出在buildUtil
任务中,正如错误所示。 buildUtil
声明compile
闭包,但默认任务不存在此类闭包。
让我试着澄清你的设置是什么。 util.TestGroupScanner
源位于src/test/java/util
目录中,您希望与其他源(可能是src/main/java
和src/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
设置。
答案 1 :(得分:0)
要使用gradle解决此问题,我建议为您的util类创建一个特定的sourceset,并添加一个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
}
的问候, 勒