85

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

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

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

4

9 に答える 9

108

'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用です。グルーヴィーにも使えると思います。

于 2011-03-01T10:20:52.450 に答える
18

This is a simpler solution that doesn't require an intermediate jar file:

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

There's more discussion in this question: Multi-project test dependencies with gradle

于 2015-08-18T21:45:28.273 に答える
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")
于 2012-10-30T14:07:05.767 に答える
6

これは、Gradle のファースト クラス機能としてサポートされるようになりました(5.6 以降)。

javaまたはプラグインを含むモジュールには、testFixtures ヘルパーで使用されるヘルパー クラスとリソースを公開するプラグインjava-libraryを含めることもできます。アーティファクトと分類子に対するこのアプローチの利点は次のとおりです。java-test-fixtures

  • 適切な依存関係管理 (実装/API)
  • テスト コードからの適切な分離 (別のソース セット)
  • ユーティリティのみを公開するためにテストクラスを除外する必要はありません
  • Gradleによって維持されます

例:

:モジュール:1

モジュール/1/build.gradle

plugins {
  id "java-library" // or "java"
  id "java-test-fixtures"
}

dependencies {
  testFixturesImplementation("your.jar:dependency:0.0.1")
}

または、メイン構成のすべての依存関係をlazyly追加するだけです:implementation

val testFixturesImplementation by configurations.existing
val implementation by configurations.existing
testFixturesImplementation.get().extendsFrom(implementation.get())

modul /one/src/ testFixtures /java/com/example/Helper.java

package com.example;
public class Helper {}

:モジュール:その他

モジュール/その他/build.gradle

plugins {
  id "java" // or "java-library"
}
dependencies {
  testImplementation(testFixtures(project(":modul:one")))
}

modul/other/src/test/java/com/example/other/SomeTest.java

package com.example.other;
import com.example.Helper;
public class SomeTest {
  @Test void f() {
    new Helper(); // used from :modul:one's testFixtures
  }
}

詳細については、ドキュメントを参照してください: https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures

于 2021-02-10T14:18:21.157 に答える
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
     }
于 2012-05-31T14:22:30.800 に答える
5

ProjectA に ProjectB で使用するテスト コードが含まれており、ProjectB がアーティファクトを使用してテスト コードを含める場合、ProjectB のbuild.gradleは次のようになります。

dependencies {

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

}

次に、ProjectA の build.gradlearchivesのセクションにコマンドを追加する必要があります。artifacts

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 依存関係として追加できます (上記を参照)。

于 2019-02-11T23:41:53.623 に答える
0

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

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
于 2016-11-01T17:33:03.150 に答える
0

Gradleの場合1.5

task testJar(type: Jar, dependsOn: testClasses) {
    from sourceSets.test.java
    classifier "tests"
}
于 2015-07-23T15:54:10.613 に答える