Залежність від тесту Грейдла


81

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

Проект A вимагає проекту B. Це справедливо як для компіляції, так і для тестового коду.

Як я можу налаштувати тестові класи проекту A на доступ до тестових класів проекту B?


2
можливий дублікат: stackoverflow.com/questions/5644011/…
Mike Rylander

Відповіді:


106

Ви можете виставити тестові класи за допомогою конфігурації '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.


1
Якщо я розумію ваше запитання, тоді так, наскільки я знаю, вам потрібно буде скласти тестові класи, щоб використовувати їх як залежності.
Девід Реснік,

1
для пізніших версій Gradle (я використовую 1.3) у рядку "from sourceSets.test.classes" слід читати "from sourceSets.test.output"
Бен,

2
Щоб також взяти на себе всі транзитивні залежності тестів, я додав: configurations { tests { extendsFrom testRuntime } }
Рамон,

3
Як досягти цього для класів androidTest?
X-HuMan

3
не працює для мене, завжди отримуй -Could not get unknown property 'testClasses'
Pavle

17

Це більш просте рішення, яке не вимагає проміжного файлу jar:

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

У цьому питанні є більше обговорення: Тестові залежності для декількох проектів за допомогою gradle


7
Це порушує інтеграцію IDE і пропускає транзитивні залежності. Це також порушує інкапсуляцію проектів, що завжди є поганою практикою.
Stefan Oehme

8

Це працює для мене (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

Вищевказане рішення працює, але не для останньої версії 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
     }

5

Якщо 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 публікуються у вашій артефакторії, вони включатимуть банку -тести . Це - тестів банку потім може бути доданий в якості залежно testCompile для ProjectB (як показано вище).



0

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

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.