Java 如何向Gradle添加新的源集?
我想将集成测试添加到我的Gradle版本(1.0版)。它们应该与我的常规测试分开运行,因为它们需要将一个webapp部署到localhost(它们测试该webapp)。测试应该能够使用在我的主源集中定义的类。如何实现这一点?2021年更新: 在过去的八十多年里发生了很大的变化。Gradle仍然是一个伟大的工具。现在,文档中有一整节专门用于配置集成测试。我现在推荐你 原始答案: 我花了一段时间才弄明白,网上的资源不是很好。所以我想记录我的解决方案 这是一个简单的gradle构建脚本,除了主源代码集和测试源代码集之外,还有一个intTest源代码集:Java 如何向Gradle添加新的源集?,java,gradle,build,integration-testing,source-sets,Java,Gradle,Build,Integration Testing,Source Sets,我想将集成测试添加到我的Gradle版本(1.0版)。它们应该与我的常规测试分开运行,因为它们需要将一个webapp部署到localhost(它们测试该webapp)。测试应该能够使用在我的主源集中定义的类。如何实现这一点?2021年更新: 在过去的八十多年里发生了很大的变化。Gradle仍然是一个伟大的工具。现在,文档中有一整节专门用于配置集成测试。我现在推荐你 原始答案: 我花了一段时间才弄明白,网上的资源不是很好。所以我想记录我的解决方案 这是一个简单的gradle构建脚本,除了主源代码集
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
}
下面是我如何在不使用
配置{}
的情况下实现这一点的
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
}
使用:渐变1.4和渐变1.6进行测试
这是2016年为Gradle 2.x/3.x编写的,已经过时了!!
请看一看
总结这两个古老的答案(获得两个世界的最佳和最低可行): 先说几句温暖的话:
sourceSet
:
sourceset{
集成测试
}
test
展开sourceSet
,因此我们使用test.runtimeClasspath
(包括test
和test
本身的所有依赖性)作为派生sourceSet
的类路径:
sourceset{
集成测试{
compileClasspath+=sourceSets.test.runtimeClasspath
runtimeClasspath+=sourceset.test.runtimeClasspath//***)
}
}
- 注意)不知何故,
的这种重新声明/扩展是需要的,但应该是不相关的,因为sourceset.integrationTest.runtimeClasspath
总是扩展runtimeClasspath
,不要理解它output+runtimeSourceSet
任务集成测试(类型:测试){
}
integrationTest
测试类和类路径。java
插件的默认值使用test
sourceSet
任务集成测试(类型:测试){
testClassesDir=sourceset.integrationTest.output.classesDir
classpath=sourceset.integrationTest.runtimeClasspath
}
源集中添加java资源,以支持自动检测并在IDE中创建这些“部分”。i、 e.IntelliJ IDEA将自动为每个集合创建sourceSet
目录和资源,如果该集合不存在:
sourceset{
集成测试{
JAVA
资源
}
}
apply插件:“java”
//将“测试”源集中的runtimeClasspath应用到新的源集中
//包括任何需要的资产:测试、主、测试依赖项和主依赖项
源集{
集成测试{
//不需要,但对IDEa来说很好
JAVA
资源
compileClasspath+=sourceSets.test.runtimeClasspath
//不知何故,这种重新声明是必要的,但应该是无关紧要的
//因为runtimeClasspath总是扩展compileClasspath
runtimeClasspath+=sourceset.test.runtimeClasspath
}
}
//定义用于运行集成测试的自定义测试任务
任务集成测试(类型:测试){
testClassesDir=sourceset.integrationTest.output.classesDir
classpath=sourceset.integrationTest.runtimeClasspath
}
tasks.integrationTest.dependsOn(tasks.test)
指:
apply plugin: 'nebula.facet'
facets {
integrationTest {
parentSourceSet = 'test'
}
}
特别是对于集成测试,只需应用:
apply plugin: 'nebula.integtest'
每个插件的Gradle插件门户链接如下:
以下是在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现在为源集中的每种语言使用单独的类目录。因此,如果构建脚本使用sourceset.integrationTest.output.classesDir
,您将看到以下弃用警告
Gradle现在为每种JVM语言使用单独的输出目录,但此构建假定源集中的所有类都有一个单独的目录。此行为已被弃用,并计划在Gradle 5.0中删除
要消除此警告,只需切换到sourceset.integrationTest.output.classesDirs
。有关更多信息,请参阅。如果您正在使用
- Gradle 5.x,看看
示例14和15了解详细信息(Groovy和Kotlin DSL,您更喜欢哪一种)
- alt:“当前”Gradle文档链接位于,但将来可能会延迟,您应该查看示例是否更改)
- 对于Gradle 4,看一看古代版本,它接近于什么
plugin {
idea
}
idea {
module {
testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
}
}
我是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,那么您还可以在依赖项下指定实现
我必须指定存储库
部分才能让它工作,我怀疑这是最好的/唯一的方法。<
apply plugin: 'java'
repositories { jcenter() }
dependencies {
testImplementation 'junit:junit:4.12'
}
sourceSets {
main {
java {
srcDirs = ['src']
}
}
test {
java {
srcDirs = ['tests']
}
}
}