Зависимость Теста Gradle


У меня есть два проекта, проект A и проект B. Оба написаны в groovy и используют gradle в качестве своей системы сборки.

для проекта A требуется проект B. Это справедливо как для компиляции, так и для тестового кода.

Как я могу настроить, что тестовые классы проекта A имеют доступ к тестовым классам проекта B?

6 62

6 ответов:

вы можете предоставить тестовые классы через конфигурацию "тесты", а затем определить зависимость testCompile от этой конфигурации.

у меня есть этот блок для всех java-проектов, который jars весь тестовый код:

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

configurations {
    tests
}

artifacts {
    tests testJar
}

затем, когда у меня есть тестовый код, я хочу получить доступ между проектами, которые я использую

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

Это для Java; я предполагаю, что он должен работать и для groovy.

Это более простое решение, которое не требует промежуточного файла jar:

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

в этом вопросе больше обсуждения:многопроектные тестовые зависимости с gradle

это работает для меня (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")

выше решение работает, но не для последней версии 1.0-rc3 от 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
     }

для Android на последней версии gradle (я в настоящее время на 2.14.1) вам просто нужно добавить ниже в Project B, чтобы получить все тестовые зависимости от Project A.

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

Для Gradle 1.5

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