Gradle测试依赖性


Answers:


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的;我假设它也应该适用于常规。


1
如果我理解您的问题,那么,据我所知,您需要编译测试类以将它们用作依赖项。
David Resnick

1
对于摇篮的更高版本(我使用的是1.3)“从sourceSets.test.classes”该行应“从sourceSets.test.output”读

2
为了同时引入测试的所有传递依赖关系,我添加了: configurations { tests { extendsFrom testRuntime } }
Ramon 2014年

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 '02

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-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
     }

5

如果ProjectA包含您要在ProjectB中使用的测试代码,并且ProjectB要使用工件来包含测试代码,则ProjectB的build.gradle如下所示:

dependencies {

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

}

然后,您需要向ProjectA的build.gradle中archivesartifacts部分添加命令:

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。然后可以将此-tests jar添加为ProjectB的testCompile依赖项(如上所示)。


0

对于摇篮 1.5

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

0

对于最新的gradle版本(我目前为2.14.1)上的Android,您只需在Project B中添加以下内容即可从Project A获得所有测试依赖项。

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.