Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向Gradle添加新的源集?_Java_Gradle_Build_Integration Testing_Source Sets - Fatal编程技术网

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

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构建脚本,除了主源代码集

我想将集成测试添加到我的Gradle版本(1.0版)。它们应该与我的常规测试分开运行,因为它们需要将一个webapp部署到localhost(它们测试该webapp)。测试应该能够使用在我的主源集中定义的类。如何实现这一点?

2021年更新:

在过去的八十多年里发生了很大的变化。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
}

下面是我如何在不使用
配置{}
的情况下实现这一点的

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
    资源
    }
    }
    
  • tl;dr

    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,看一看古代版本,它接近于什么
    要使IntelliJ将自定义源集识别为测试源根,请执行以下操作:

    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']
        }
      }
    }