it-swarm.com.de

Gradle Test Abhängigkeit

Ich habe zwei Projekte, Projekt A und Projekt B. Beide sind in Groovy geschrieben und verwenden Gradle als Build-System. 

Projekt A erfordert Projekt B. .. Dies gilt sowohl für den Kompilierungs- als auch für den Testcode. 

Wie kann ich konfigurieren, dass die Testklassen von Projekt A Zugriff auf die Testklassen von Projekt B haben?

67

Sie können die Testklassen über eine 'Test'-Konfiguration verfügbar machen und dann eine Abhängigkeit von TestCompile von dieser Konfiguration definieren.

Ich habe diesen Block für alle Java-Projekte, die den gesamten Testcode enthalten:

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

configurations {
    tests
}

artifacts {
    tests testJar
}

Wenn ich dann Testcode habe, möchte ich auf die von mir verwendeten Projekte zugreifen

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

Dies ist für Java. Ich gehe davon aus, dass es auch für Groovy funktionieren sollte.

95
David Resnick

Dies ist eine einfachere Lösung, für die keine Zwischen-JAR-Datei erforderlich ist:

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

In dieser Frage gibt es weitere Diskussionen: Abhängigkeiten von mehreren Projekten mit Gradle

13
Kip

Das funktioniert für mich (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

Die obige Lösung funktioniert, jedoch nicht für die neueste Version 1.0-rc3 von 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

Für Android auf der neuesten Gradle-Version (ich bin derzeit auf 2.14.1) müssen Sie lediglich das Folgende in Projekt B hinzufügen, um alle Testabhängigkeiten von Projekt A zu erhalten.

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

Wenn ProjectA den Testcode enthält, den Sie in ProjectB verwenden möchten, und ProjectB Artefakte verwenden soll, um den Testcode einzuschließen, würde ProjectBs build.gradle folgendermaßen aussehen:

dependencies {

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

}

Dann müssen Sie dem Abschnitt archives in ProjectA build.gradle einen artifacts-Befehl hinzufügen:

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

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

Wenn die Artefakte von ProjectA nun in Ihrer Artefakte veröffentlicht werden, werden sie mit einem -tests -Dose versehen. Dieses -tests -Dar kann dann als testCompile-Abhängigkeit für ProjectB hinzugefügt werden (wie oben gezeigt). 

0
Joman68

Für Gradle 1.5

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