Gradle自定义测试源集

时间:2016-07-14 08:23:17

标签: testing intellij-idea gradle

我有一个gradle项目,并且主要测试作为sourceSets。

我确实希望test-main不是测试源集的一部分。现在我遇到的问题是,在构建项目时, test-main 被标记为 Sources Root 而不是测试源Root

这会导致编译错误,我必须手动将 test-mains 标记为所有子项目的源测试根。

我创建了一个任务,以强制intellij将它们标记为Sources Test Root但似乎我做错了。

提示:

  • Intellij IDEA 2016.2
  • Gradle 2.14

谢谢,

subprojects {
  apply plugin: 'java' // all our projects are Java projects

  sourceCompatibility = '1.8'
  targetCompatibility = '1.8'

  tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
    options.warnings = false // There are too many :-(
  }

  configurations {
    testMainsCompile.extendsFrom testCompile
    testMainsRuntime.extendsFrom testMainsCompile
  }

  sourceSets {
    main {
      java {
        srcDirs = ['src']
      }
      resources {
        srcDirs = ['src']
      }
    }
    test {
      java {
        srcDirs = ['test']
      }
      resources {
        srcDirs = ['test']
      }
    }
    testMains {
      java {
        srcDirs = ['test-mains']
        compileClasspath = test.output + main.output + configurations.testMainsCompile
        runtimeClasspath = output + compileClasspath + configurations.testMainsRuntime
      }
      resources {
        srcDirs = ['test-mains']
      }
    }
  }

  // dummy task just to convince intellij idea that testMains is a test class folder
  task testMainsTest(type: Test) {
    testClassesDir = sourceSets.testMains.output.classesDir
    classpath += sourceSets.testMains.runtimeClasspath
  }

[...]

}

2 个答案:

答案 0 :(得分:3)

我必须指定想法插件:

subprojects {
  apply plugin: 'idea'

  idea {
    module {
      testSourceDirs += file('test-mains')
    }
  }
}

答案 1 :(得分:1)

我参加聚会真的很晚,但有 11k 的观看次数,这可能对其他人有用。在这一点上,我们已经到了 Gradle 6 和 IntelliJ 2020。要将并行测试文件夹链接到 Gradle 和 IntelliJ,您需要创建文件夹结构,然后几乎完全如上声明源集。源集告诉 IntelliJ 有关子模块的信息,因此它们在 IntelliJ 中显示为带有蓝色方块的文件夹。

Maxime 回答了有关制作源文件夹测试源的问题,该问题由idea 插件处理(尽管您也可以在 IntelliJ 中从文件夹的上下文菜单中手动执行此操作)。

但是,他这里有几件事没有提到。

我可能会将资源源放在 Java 源文件夹的 NEXT 中,而不是与它相同。通常,Gradle/Maven 应用程序在“java”旁边有“资源”。

关于文件夹名称的警告。 Maxime 具有不同的源集名称和文件夹名称。我试过了,我想要 - 在文件夹名称中。但是当我尝试 IntelliJ 时,它在项目结构中有点偏离轨道,为源集名称显示了一个红色的内容源。可能只是我,也许我有其他问题:)

Maxime 巧妙地扩展了 testCompile 以获取项目 compileClasspath,然后为 runtimeClasspath 使用相同的值。但是如果 runtimeClasspath 在项目级别不同怎么办?我使用的 gradle snippit 是直接从项目中获取的(main 和 test 是项目中默认的子模块):

    testIntegration {
    java {
        compileClasspath += project.configurations.testCompileClasspath + main.output + test.output
        runtimeClasspath += project.configurations.testRuntimeClasspath + main.output + test.output
        srcDir file('src/testIntegration/java')
    }
    resources {
        srcDir file('src/testIntegration/resources')
    }
}