java 如何向Gradle添加新的源集?

iqjalb3h  于 2022-12-10  发布在  Java
关注(0)|答案(9)|浏览(126)

我想将集成测试添加到我的Gradle构建版本(1.0版)。它们应该与我的常规测试分开运行,因为它们需要将Web应用部署到localhost(它们测试该Web应用)。测试应该能够使用我的主源集中定义的类。

qlfbtfca

qlfbtfca1#

2021年更新:

8年来发生了很多变化。Gradle仍然是一个很棒的工具。现在文档中有一整节专门用于配置集成测试。我建议您现在就阅读文档。

原始答案:

这花了我一段时间才弄明白,而且在线资源也不是很好,所以我想把我的解决方案记录下来。
这是一个简单的gradle构建脚本,除了主源集和测试源集之外,还包含一个intTest源集:

apply plugin: "java"

sourceSets {
    // Note that just declaring this sourceset creates two configurations.
    intTest {
        java {
            compileClasspath += main.output
            runtimeClasspath += main.output
        }
    }
}

configurations {
    intTestCompile.extendsFrom testCompile
    intTestRuntime.extendsFrom testRuntime
}

task intTest(type:Test){
    description = "Run integration tests (located in src/intTest/...)."
    testClassesDir = project.sourceSets.intTest.output.classesDir
    classpath = project.sourceSets.intTest.runtimeClasspath
}
3htmauhk

3htmauhk2#

下面是我在不使用configurations{ }的情况下实现这一点的方法。

apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_6

sourceSets {
    integrationTest {
        java {
            srcDir 'src/integrationtest/java'
        }
        resources {
            srcDir 'src/integrationtest/resources'
        }
        compileClasspath += sourceSets.main.runtimeClasspath
    }
}

task integrationTest(type: Test) {
    description = "Runs Integration Tests"
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath += sourceSets.integrationTest.runtimeClasspath
}

***测试使用:*Gradle 1.4和Gradle 1.6

w3nuxt5m

w3nuxt5m3#

这是曾经在2016年为Gradle 2.x / 3.x编写的,已经过时了!!请看看at the documented solutions in Gradle 4 and up
总结两个旧的答案(得到最好的和最小可行的两个世界):
先说几句温暖的话:
1.首先,我们需要定义sourceSet

sourceSets {
    integrationTest
}
  • 接下来,我们从test扩展sourceSet,因此我们使用test.runtimeClasspath(它包括来自test的所有相关性AND test本身)作为派生的sourceSet的类路径:
sourceSets {
    integrationTest {
        compileClasspath += sourceSets.test.runtimeClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath // ***)
    }
}

*注意)不知何故,需要对sourceSets.integrationTest.runtimeClasspath进行此重新声明/扩展,但由于runtimeClasspath始终扩展output + runtimeSourceSet,因此应该是无关紧要的,不要获取它

  • 我们定义了一个专门用于运行集成测试的任务:
task integrationTest(type: Test) {
}
  • 配置所使用的integrationTest测试类和类路径。java插件的默认值使用testsourceSet
task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
    • (可选)* 测试后 * 自动运行 *
integrationTest.dependsOn test
    • (可选)* 从check添加依赖项(这样,当执行buildcheck时,它始终运行)
tasks.check.dependsOn(tasks.integrationTest)
    • (可选)* 将java,resources添加到sourceSet以支持自动检测并在IDE中创建这些“部分”。例如,IntelliJ IDEA将自动为每个集创建sourceSet目录java和resources(如果它不存在):
sourceSets {
     integrationTest {
         java
         resources
     }
}

tl;医生

apply plugin: 'java'

// apply the runtimeClasspath from "test" sourceSet to the new one
// to include any needed assets: test, main, test-dependencies and main-dependencies
sourceSets {
    integrationTest {
        // not necessary but nice for IDEa's
        java
        resources

        compileClasspath += sourceSets.test.runtimeClasspath
        // somehow this redeclaration is needed, but should be irrelevant
        // since runtimeClasspath always expands compileClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath
    }
}

// define custom test task for running integration tests
task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
tasks.integrationTest.dependsOn(tasks.test)

指的是:

  • gradle java第45.7.1章源代码集属性
  • gradle java第45.7.3章。一些源代码集示例

不幸的是,github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle…/gradle/…/withIntegrationTests/build.gradle上的示例代码似乎没有处理这个问题,或者有一个不同的/更复杂的/对我来说没有更清楚的解决方案!

vsnjm48y

vsnjm48y4#

星云面插件消除了样板文件:

apply plugin: 'nebula.facet'
facets {
    integrationTest {
        parentSourceSet = 'test'
    }
}

特别是对于集成测试,即使这是为您完成的,也只需应用:

apply plugin: 'nebula.integtest'

每个插件的Gradle门户链接为:

  1. nebula.facet
  2. nebula.integtest
crcmnpdw

crcmnpdw5#

如果您正在使用

  • Gradle 5.x,请查看文档部分“测试Java〉配置集成测试示例14和15以了解详细信息(Groovy和KotlinDSL都适用,您可以选择哪一个)
  • alt:“current”Gradle文档链接位于2,但将来可能会延迟,如果示例发生变化,您应该查看一下)
  • 对于Gradle 4,请查看古代版本3,它与@Spina在2012年发布的内容非常接近

要使IntelliJ将自定义源集识别为测试源根,请执行以下操作:

plugin {
    idea
}

idea {
    module {
        testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
        testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
    }
}
stszievb

stszievb6#

以下是自Gradle 4.0起适用于我的内容。

sourceSets {
  integrationTest {
    compileClasspath += sourceSets.test.compileClasspath
    runtimeClasspath += sourceSets.test.runtimeClasspath
  }
}

task integrationTest(type: Test) {
  description = "Runs the integration tests."
  group = 'verification'
  testClassesDirs = sourceSets.integrationTest.output.classesDirs
  classpath = sourceSets.integrationTest.runtimeClasspath
}

从版本4.0开始,Gradle现在为源集中的每种语言使用单独的类目录。因此,如果您的构建脚本使用sourceSets.integrationTest.output.classesDir,您将看到以下弃用警告。
Gradle现在为每种JVM语言使用单独的输出目录,但此版本假设源集中的所有类使用单个目录。
要消除此警告,只需切换到sourceSets.integrationTest.output.classesDirs即可。有关更多信息,请参阅Gradle 4.0发行说明。

apeeds0o

apeeds0o7#

我想在2012年这个问题被问到的时候,文档并不好,但是对于任何在2020年以后阅读这篇文章的人来说:现在文档中有一整节是关于如何为集成测试添加源代码集的。你真的应该阅读它,而不是复制/粘贴代码片段,然后一头撞到墙上,试图找出为什么2012-2016年的答案不太管用。
答案很可能很简单,但比你想象的要微妙得多,而且你需要的确切代码可能与我需要的代码不同。例如,你希望你的集成测试使用与单元测试相同的依赖关系吗?

63lcw9qa

63lcw9qa8#

您可能还希望配置测试以使用jUnit运行:

task integrationTest(type: Test) {
   ...
   useJunitPlatform()
}
iih3973s

iih3973s9#

我是Gradle的新手,正在使用Gradle 6.0.1 JUnit 4.12。以下是我为解决这个问题而想到的方法。

apply plugin: 'java'
repositories { jcenter() }

dependencies {
    testImplementation 'junit:junit:4.12'
}

sourceSets {
  main {
    java {
       srcDirs = ['src']
    }
  }
  test {
    java {
      srcDirs = ['tests']
    }
  }
}

请注意,主源代码和测试源代码是分别引用的,一个在main下,另一个在test下。
dependencies下的testImplementation项只用于编译test中的源代码。如果主代码实际上对JUnit有依赖关系,那么您还应该在dependencies下指定implementation
我必须指定repositories部分才能让它工作,我怀疑这是最好的/唯一的方法。

相关问题