Gradleテストの依存関係


81

プロジェクトAとプロジェクトBの2つのプロジェクトがあります。どちらもGroovyで記述されており、ビルドシステムとしてgradleを使用しています。

プロジェクトAにはプロジェクトBが必要です。これは、コンパイルコードとテストコードの両方に当てはまります。

プロジェクトAのテストクラスがプロジェクトBのテストクラスにアクセスできるように構成するにはどうすればよいですか?


2

回答:


106

'tests'構成を介してテストクラスを公開し、その構成に対するtestCompile依存関係を定義できます。

私はすべてのJavaプロジェクトにこのブロックを持っています。これはすべてのテストコードをjarします:

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 2012

1
それ以降のバージョンのGradle(1.3を使用)の場合、「from sourceSets.test.classes」の行は、「from sourceSets.test.output」と表示されます
Ben

2
同様のテストのすべての推移的依存関係で引っ張って、私が追加しました: configurations { tests { extendsFrom testRuntime } }
ラモン

3
androidTestクラスで同じことを達成する方法は?
X-HuMan 2017年

3
私のために働いていない、常に取得-Could not get unknown property 'testClasses'
pavle

17

これは、中間のjarファイルを必要としないより単純なソリューションです。

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

この質問にはさらに議論があります:gradleを使用したマルチプロジェクトテストの依存関係


7
これにより、IDE統合が壊れ、推移的な依存関係が失われます。また、プロジェクトのカプセル化も破られますが、これは常に悪い習慣です。
Stefan Oehme 2017

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のセクションにarchivesコマンドを追加する必要がありますartifacts

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

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

これで、ProjectAのアーティファクトがアーティファクトに公開されると、-testsjarが含まれます。この-testsjarは、ProjectBのtestCompile依存関係として追加できます(上記を参照)。



0

最新のgradleバージョン(私は現在2.14.1を使用しています)のAndroidの場合、プロジェクトAからすべてのテスト依存関係を取得するには、プロジェクトBに以下を追加する必要があります。

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.