首页 > 解决方案 > 从 Gradle 中的 FileTree 运行 Junit 测试

问题描述

我有一个 Gradle 文件(test.gradle),它当前正在从包含类名的 XML 文件中读取以确定要运行的测试。要测试的类从 XML 中过滤(到文件树中),然后使用 groovy 的 ant.junit() 运行。这主要是因为有单独的 Bamboo 代理需要运行特定的测试,这取决于提供的属性。我想在每个代理中并行运行任务。ant.junit 没有类似 maxParallelForks 选项来指定要并行启动的 JVM 的确切数量。

当前发生的事情: - 在竹子中,test.gradle 被重命名为 build.gradle。它解压缩一个包含所有类的 jar 并将它们放在目标构建目录中。- 有一项任务可以根据 Bamboo 配置中提供的属性从目标构建目录中过滤要测试的类(基于提供的 XML)到文件树中。- 然后 ant.junit 使用以下命令运行测试:

batchtest(todir: "${testDir}") {
      ant.filelist(dir: "${targetDir}/build", files: 
      filteredTests.join(","))
}

尝试过的事情: - 我试图将任务(将测试过滤到文件树并使用 ant 运行它们的任务)类型更改为测试。但这似乎不起作用。我的假设是因为没有项目结构并且从解压缩的 jar 中挑选东西,所以测试任务不知道如何运行它们。- 我尝试创建一个单独的 gradle 测试任务(这将取决于过滤任务),其中包括 fileTree。但是运行似乎没有从包含的测试中找到类。我需要提及他们需要从中挑选的目录吗?

标签: xmlgradlegroovyjunitant

解决方案


假设您的 xml 类似于

<tests>
   <test>foo.bar.Test1</test>
   <test>foo.bar.Test2</test>
</tests>

你可以做类似的事情

task unzipTestClasses(type:Copy) {
   from zipTree('path/to/testClasses.zip')
   into "$buildDir/testClasses" 
}   
task runTestClasses(type:Test) {
   dependsOn 'unzipTestClasses' 
   testClassesDirs = "$buildDir/testClasses"  
   def root = new XmlSlurper().parse(file('path/to.xml'))
   include root.tests.test.collect { "${it.text().replace('.', '/')}.class" } 
}      

推荐阅读