componentes agregar java gradle build integration-testing source-sets

java - agregar - ¿Cómo agrego un nuevo conjunto de orígenes a Gradle?



agregar componentes a un jpanel java (5)

Aquí es cómo lo logré sin usar 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 }

Probado usando: Gradle 1.4 y Gradle 1.6

Quiero agregar pruebas de integración a mi compilación de Gradle (Versión 1.0). Deberían ejecutarse por separado de mis pruebas normales porque requieren que se implemente una aplicación web en localhost (prueban esa aplicación web). Las pruebas deberían poder usar clases definidas en mi fuente principal. ¿Cómo hago que esto suceda?


El complemento nebula-facet elimina la repetición:

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

Para pruebas de integración específicamente, incluso si esto se hace por usted , simplemente aplique:

apply plugin: ''nebula.integtest''

Los enlaces del portal del complemento Gradle para cada uno son:

  1. nebula.facet
  2. nebula.integtest

Esto es lo que funciona para mí a partir de 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 }

A partir de la versión 4.0, Gradle ahora usa directorios de clases separados para cada idioma en un conjunto fuente. Entonces, si su script de compilación usa sourceSets.integrationTest.output.classesDir , verá la siguiente advertencia de desaprobación.

Gradle ahora usa directorios de salida separados para cada lenguaje JVM, pero esta compilación asume un único directorio para todas las clases desde un conjunto fuente. Este comportamiento ha quedado obsoleto y está programado para eliminarse en Gradle 5.0

Para deshacerse de esta advertencia, simplemente cambie a sourceSets.integrationTest.output.classesDirs en sourceSets.integrationTest.output.classesDirs lugar. Para obtener más información, consulte las notas de la versión de Gradle 4.0 .


Esto me llevó un tiempo descubrirlo y los recursos en línea no eran geniales. Así que quería documentar mi solución.

Este es un script simple de compilación gradle que tiene un conjunto de fuentes intTest además de los conjuntos fuente principales y de prueba:

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 }


Para resumir ambas respuestas anteriores (obtener el mejor y mínimo viable de ambos mundos):

algunas palabras cálidas primero:

  1. primero, necesitamos definir el conjunto de origen:

    sourceSets { integrationTest }

  2. A continuación, ampliamos SourceSet de la prueba, para lo cual utilizamos la prueba runtimeClasspath (que incluye todas las pruebas de la prueba AND test en sí) como classpath para el sourceSet derivado

    sourceSets { integrationTest { compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath // ***) } }

    • *** nota) de alguna manera esta redeclaración / extensión para sourceSets.integrationTest.runtimeClasspath es necesaria, pero debe ser irrelevante ya que runtimeClasspath siempre expande output + runtimeSourceSet , no lo obtiene
  3. definimos una tarea dedicada solo para ejecutar pruebas de integración

    task integrationTest(type: Test) { }

  4. Dile a la tarea de prueba qué clases de prueba y classPaths se deben usar en lugar de los valores predeterminados del conjunto de orígenes "de prueba"

    task integrationTest(type: Test) { testClassesDir = sourceSets.integrationTest.output.classesDir classpath = sourceSets.integrationTest.runtimeClasspath }

  5. (opcional) ejecución automática después de la prueba

    integrationTest.dependsOn test

  6. (opcional) ejecución automática con cheque

    check.dependsOn integrationTest

  7. (opcional) agregue java, resources a sourceSet para permitir la detección automática y crear estos "parciales" en su IDE. es decir, IntelliJ IDEA creará automáticamente directorios sourceSet java y recursos para cada conjunto si no existe

    sourceSets { integrationTest { java resources } }

tl; dr

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 } integrationTest.dependsOn test

refiriéndose a:

desafortunadamente, el código de ejemplo en github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle o …/gradle/…/withIntegrationTests/build.gradle parece no manejar esto o tiene una diferente / más complejo / ¡para mí no hay una solución más clara de todos modos!