Dependencia de la prueba de Gradle

81

Tengo dos proyectos, el proyecto A y el proyecto B. Ambos están escritos en groovy y usan gradle como su sistema de construcción.

El proyecto A requiere el proyecto B. Esto es válido tanto para el código de compilación como para el de prueba.

¿Cómo puedo configurar que las clases de prueba del proyecto A tengan acceso a las clases de prueba del proyecto B?

Dr. Simon Harrer
fuente
2
posible duplicado: stackoverflow.com/questions/5644011/…
Mike Rylander

Respuestas:

106

Puede exponer las clases de prueba a través de una configuración de 'pruebas' y luego definir una dependencia testCompile en esa configuración.

Tengo este bloque para todos los proyectos de Java, que contiene todo el código de prueba:

task testJar(type: Jar, dependsOn: testClasses) {
    baseName = "test-${project.archivesBaseName}"
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testJar
}

Luego, cuando tenga el código de prueba, quiero acceder entre los proyectos que uso

dependencies {
    testCompile project(path: ':aProject', configuration: 'tests')
}

Esto es para Java; Supongo que también debería funcionar para groovy.

David Resnick
fuente
1
Si entiendo su pregunta, entonces sí, por lo que sé, deberá compilar las clases de prueba para usarlas como dependencias.
David Resnick
1
para versiones posteriores de Gradle (estoy usando 1.3) la línea "from sourceSets.test.classes" debería leer "from sourceSets.test.output"
Ben
2
Para extraer todas las dependencias transitivas de las pruebas también, agregué: configurations { tests { extendsFrom testRuntime } }
Ramon
3
¿Cómo lograr lo mismo para las clases androidTest?
X-HuMan
3
no funciona para mí, siempre obtén -Could not get unknown property 'testClasses'
pavle
17

Esta es una solución más simple que no requiere un archivo jar intermedio:

dependencies {
  ...
  testCompile project(':aProject').sourceSets.test.output
}

Hay más discusión en esta pregunta: dependencias de prueba multiproyecto con gradle

Dormir
fuente
7
Esto rompe la integración de IDE y pierde las dependencias transitivas. También rompe la encapsulación de proyectos, lo que siempre es una mala práctica.
Stefan Oehme
8

Esto funciona para mí (Java)

// use test classes from spring-common as dependency to tests of current module
testCompile files(this.project(':spring-common').sourceSets.test.output)
testCompile files(this.project(':spring-common').sourceSets.test.runtimeClasspath)

// filter dublicated dependency for IDEA export
def isClassesDependency(module) {
     (module instanceof org.gradle.plugins.ide.idea.model.ModuleLibrary) && module.classes.iterator()[0].url.toString().contains(rootProject.name)
}

idea {
      module {
          iml.whenMerged { module ->
              module.dependencies.removeAll(module.dependencies.grep{isClassesDependency(it)})
              module.dependencies*.exported = true
          }
      }
  }
.....  
// and somewhere to include test classes 
testRuntime project(":spring-common")
Michail Nikolaev
fuente
5

La solución anterior funciona, pero no para la última versión 1.0-rc3de Gradle.

     task testJar(type: Jar, dependsOn: testClasses) {
       baseName = "test-${project.archivesBaseName}"

       // in the latest version of Gradle 1.0-rc3
       // sourceSets.test.classes no longer works
       // It has been replaced with 
       // sourceSets.test.output

       from sourceSets.test.output
     }
pokkie
fuente
5

Si ProjectA contiene el código de prueba que desea usar en ProjectB y ProjectB quiere usar artefactos para incluir el código de prueba, entonces build.gradle de ProjectB se vería así:

dependencies {

  testCompile("com.example:projecta:1.0.0-SNAPSHOT:tests")

}

Luego, debe agregar un archivescomando a la artifactssección en build.gradle de ProjectA:

task testsJar(type: Jar, dependsOn: testClasses) {
    classifier = 'tests'
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

Ahora, cuando los artefactos de ProjectA se publiquen en su artefactor, incluirán un frasco de pruebas . Este jar -tests se puede agregar como una dependencia testCompile para ProjectB (como se muestra arriba).

Joman68
fuente
0

Para Gradle 1.5

task testJar(type: Jar, dependsOn: testClasses) {
    from sourceSets.test.java
    classifier "tests"
}
Robin Elvin
fuente
0

Para Android en la última versión de gradle (actualmente estoy en 2.14.1), solo necesita agregar lo siguiente en el Proyecto B para obtener todas las dependencias de prueba del Proyecto A.

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
santugowda
fuente