Zależność testu Gradle

81

Mam dwa projekty, projekt A i projekt B. Oba są napisane w stylu groovy i używają gradle jako systemu kompilacji.

Projekt A wymaga projektu B. Dotyczy to zarówno kodu kompilacyjnego, jak i testowego.

Jak mogę skonfigurować, aby klasy testowe projektu A miały dostęp do klas testowych projektu B?

Dr Simon Harrer
źródło
2
możliwy duplikat: stackoverflow.com/questions/5644011/…
Mike Rylander

Odpowiedzi:

106

Możesz udostępnić klasy testowe za pomocą konfiguracji „testy”, a następnie zdefiniować zależność testCompile od tej konfiguracji.

Mam ten blok dla wszystkich projektów java, który zawiera cały kod testowy:

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

configurations {
    tests
}

artifacts {
    tests testJar
}

Następnie, gdy mam kod testowy, chcę uzyskać dostęp między projektami, których używam

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

To jest dla Java; Zakładam, że powinno to działać również w przypadku groovy.

David Resnick
źródło
1
Jeśli rozumiem twoje pytanie, to tak, o ile wiem, będziesz musiał skompilować klasy testowe, aby używać ich jako zależności.
David Resnick
1
w późniejszych wersjach Gradle (używam 1.3) wiersz „from sourceSets.test.classes” powinien brzmieć „from sourceSets.test.output”
Ben
2
Aby pobrać wszystkie przechodnie zależności testów, dodałem: configurations { tests { extendsFrom testRuntime } }
Ramon
3
Jak osiągnąć to samo dla klas androidTest?
X-HuMan
3
nie działa dla mnie, zawsze otrzymuj -Could not get unknown property 'testClasses'
pavle
17

To prostsze rozwiązanie, które nie wymaga pośredniego pliku jar:

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

Jest więcej dyskusji w tym pytaniu: Zależności testów wieloprojektowych z gradle

Wyrko
źródło
7
To przerywa integrację IDE i pomija zależności przechodnie. Przerywa również hermetyzację projektów, co jest zawsze złą praktyką.
Stefan Oehme,
8

To działa dla mnie (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
źródło
5

Powyższe rozwiązanie działa, ale nie w najnowszej wersji 1.0-rc3Gradle.

     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
źródło
5

Jeśli ProjectA zawiera kod testowy, którego chcesz użyć w ProjectB, a ProjectB chce użyć artefaktów, aby dołączyć kod testowy, plik build.gradle ProjectB wyglądałby tak:

dependencies {

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

}

Następnie musisz dodać archivespolecenie do artifactssekcji w pliku build.gradle ProjectA:

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

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

Teraz, kiedy artefakty ProjectA zostaną opublikowane w twojej wytwórni , będą zawierać słoik -tests . Ten jar -tests można następnie dodać jako zależność testCompile dla ProjectB (jak pokazano powyżej).

Joman68
źródło
0

Dla Gradle 1.5

task testJar(type: Jar, dependsOn: testClasses) {
    from sourceSets.test.java
    classifier "tests"
}
Robin Elvin
źródło
0

W przypadku Androida w najnowszej wersji Gradle (obecnie jestem w wersji 2.14.1) wystarczy dodać poniżej w projekcie B, aby uzyskać wszystkie zależności testowe z projektu A.

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
santugowda
źródło