Gradle-Test-Abhängigkeit

80

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?

Dr. Simon Harrer
quelle
2
Mögliches Duplikat: stackoverflow.com/questions/5644011/…
Mike Rylander

Antworten:

106

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

Ich habe diesen Block für alle Java-Projekte, der den gesamten Testcode enthält:

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 zwischen den von mir verwendeten Projekten 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.

David Resnick
quelle
1
Wenn ich Ihre Frage verstehe, müssen Sie, soweit ich weiß, die Testklassen kompilieren, um sie als Abhängigkeiten zu verwenden.
David Resnick
1
Für spätere Versionen von Gradle (ich verwende 1.3) sollte die Zeile "from sourceSets.test.classes" "from sourceSets.test.output" lauten
Ben
2
Um auch alle transitiven Abhängigkeiten der Tests zu berücksichtigen, fügte ich hinzu: configurations { tests { extendsFrom testRuntime } }
Ramon
3
Wie erreicht man dasselbe für die androidTest-Klassen?
X-HuMan
3
nicht für mich arbeiten, immer bekommen -Could not get unknown property 'testClasses'
Pavle
17

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

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

In dieser Frage wird mehr diskutiert: Testabhängigkeiten für mehrere Projekte mit Gradle

Pennen
quelle
7
Dies unterbricht die IDE-Integration und übersieht transitive Abhängigkeiten. Es bricht auch die Kapselung von Projekten, was immer eine schlechte Praxis ist.
Stefan Oehme
8

Das funktioniert bei mir (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
quelle
5

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

Wenn ProjectA den Testcode enthält, den Sie in ProjectB verwenden möchten, und ProjectB Artefakte verwenden möchte, um den Testcode einzuschließen , sieht das build.gradle von ProjectB folgendermaßen aus:

dependencies {

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

}

Anschließend müssen Sie archivesdem artifactsAbschnitt in build.gradle von ProjectA einen 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 in Ihrem Artefakt veröffentlicht werden, enthalten sie ein Testglas . Dieses -tests- JAR kann dann als testCompile-Abhängigkeit für ProjectB hinzugefügt werden (wie oben gezeigt).

Joman68
quelle
0

Für Gradle 1.5

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

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

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
Santugowda
quelle