Зависимость теста Gradle - PullRequest
70 голосов
/ 28 февраля 2011

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

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

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

Ответы [ 7 ]

98 голосов
/ 01 марта 2011

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

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

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.

14 голосов
/ 19 августа 2015

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

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

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

8 голосов
/ 30 октября 2012

Это работает для меня (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")
5 голосов
/ 31 мая 2012

Приведенное выше решение работает, но не для последней версии 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
     }
1 голос
/ 01 ноября 2016

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

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
0 голосов
/ 12 февраля 2019

Если ProjectA содержит тестовый код, который вы хотите использовать в ProjectB, и ProjectB хочет использовать артефакты для включения тестового кода, то build.gradle в ProjectB будет выглядеть следующим образом:

dependencies {

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

}

Затем вам нужно добавить команду archives в раздел artifacts в 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)

Теперь, когда артефакты ProjectA будут опубликованы в вашей артефакте, они будут включать тесты банку. Этот -tests jar может быть добавлен в качестве зависимости testCompile для ProjectB (как показано выше).

0 голосов
/ 23 июля 2015

для Gradle 1.5

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