web-dev-qa-db-fra.com

Dépendance de test de Gradle

J'ai deux projets, le projet A et le projet B. Les deux sont écrits en groovy et utilisent gradle comme système de construction. 

Le projet A nécessite le projet B. Ceci est valable pour le code de compilation et le code de test. 

Comment puis-je configurer que les classes de test du projet A ont accès aux classes de test du projet B?

67
Dr. Simon Harrer

Vous pouvez exposer les classes de test via une configuration 'tests', puis définir une dépendance testCompile sur cette configuration.

J'ai ce bloc pour tous les projets Java, qui jar tout le code de test:

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

configurations {
    tests
}

artifacts {
    tests testJar
}

Puis, quand j'ai le code de test auquel je veux accéder entre les projets que j'utilise

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

Ceci est pour Java; Je suppose que cela devrait aussi fonctionner pour groovy.

95
David Resnick

C'est une solution plus simple qui ne nécessite pas de fichier jar intermédiaire:

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

Il y a plus de discussion dans cette question: Dépendances de test multi-projets avec gradle

13
Kip

Cela fonctionne pour moi (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")
8
Michail Nikolaev

La solution ci-dessus fonctionne, mais pas pour la dernière version 1.0-rc3 de 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
     }
5
pokkie

Pour Android sur la dernière version de Gradle (je suis actuellement sur la version 2.14.1), il vous suffit d’ajouter ce qui suit dans le projet B pour obtenir toutes les dépendances de test du projet A.

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

Si ProjectA contient le code de test que vous souhaitez utiliser dans ProjectB et que ProjectB souhaite utiliser artefacts pour l'inclure, alors le fichier build.gradle de ProjectB ressemblerait à ceci:

dependencies {

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

}

Ensuite, vous devez ajouter une commande archives à la section artifacts dans le fichier 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)

Désormais, lorsque les artefacts de ProjectA sont publiés sur votre artefact, ils incluent un -tests jar. Ce -tests jar peut ensuite être ajouté en tant que dépendance testCompile pour ProjectB (comme indiqué ci-dessus). 

0
Joman68

Pour Gradle 1.5

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