新しいソースセットをGradleに追加するにはどうすればよいですか?


99

Gradleビルド(バージョン1.0)に統合テストを追加したい。これらは、webappをlocalhostにデプロイする必要があるため、通常のテストとは別に実行する必要があります(そのwebappをテストします)。テストでは、メインのソースセットで定義されたクラスを使用できる必要があります。これを実現するにはどうすればよいですか?

回答:


114

これを理解するのにしばらく時間がかかり、オンラインリソースはあまりよくありませんでした。だから私は自分の解決策を文書化したかった。

これは、メインおよびテストソースセットに加えてintTestソースセットを持つ単純なGradleビルドスクリプトです。

apply plugin: "java"

sourceSets {
    // Note that just declaring this sourceset creates two configurations.
    intTest {
        java {
            compileClasspath += main.output
            runtimeClasspath += main.output
        }
    }
}

configurations {
    intTestCompile.extendsFrom testCompile
    intTestRuntime.extendsFrom testRuntime
}

task intTest(type:Test){
    description = "Run integration tests (located in src/intTest/...)."
    testClassesDir = project.sourceSets.intTest.output.classesDir
    classpath = project.sourceSets.intTest.runtimeClasspath
}

7
統合テストタスクを宣言して構成する必要があります。ドキュメントに関してはjava/withIntegrationTests、完全なGradleディストリビューションにサンプルがあります。
Peter Niederwieser

ありがとう@PeterNiederwieserサンプルビルドスクリプトを修正しました。
Spina

2
私もこれをやろうとしていました...解決策を投稿していただき、ありがとうございました:)
Igor Popov '15

@PeterNiederwieserありがとうございます。リンクしていただけませんか。私はまた、この正確な状況をドキュメントに非常に欠いていることを発見しました:新しいsourceSetを定義することはすべてうまくいっていますが、実際のコンパイル、jar、テスト、およびターゲット以外の「これへのフック」に関する情報はありません-この例のように(追加する場合を除いて) jarに追加するか、そのsourceSetから新しいjarを作成します)。
stolsvik 2014年

6行目で、IntelliJを使用すると「シンボル 'java'を解決できません」と表示されます。なぜだと思いますか?
Snekse 2014年

33

これが私がを使わずにこれを達成した方法configurations{ }です。

apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_6

sourceSets {
    integrationTest {
        java {
            srcDir 'src/integrationtest/java'
        }
        resources {
            srcDir 'src/integrationtest/resources'
        }
        compileClasspath += sourceSets.main.runtimeClasspath
    }
}

task integrationTest(type: Test) {
    description = "Runs Integration Tests"
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath += sourceSets.integrationTest.runtimeClasspath
}

テスト対象: Gradle 1.4およびGradle 1.6


2
共有してくれてありがとう!別の実装を見るのは良いことです。
Spina

1
ながら、java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }それだけで再宣言するので関係ありませんsrc/<sourceSetName>/...src/integrationtest/...、ここで:下のトンへの資本Tに変更
childno͡.de

このアプローチに注意してください。compileClasspath += sourceSets.main.runtimeClasspath2つのファイルセットを結合しています。依存関係の通常の競合解決はありません。同じライブラリの2つのバージョンになる可能性があります。構成を拡張することはそれを助けます。
カリマルティン

20

これは、Gradle 2.x / 3.x用に2016年に作成されたもので、古くなっていますGradle 4以降のドキュメント化されたソリューションをご覧ください


両方の古い答えを要約するには(両方の世界で最高と最低の実行可能性を得る):

最初に暖かい言葉:

  1. 最初に、以下を定義する必要がありますsourceSet

    sourceSets {
        integrationTest
    }
  2. 次に、sourceSetfrom を展開しtestます。そのため、派生したクラスパスとして(AND 自体test.runtimeClasspathからのすべての依存関係を含む)を使用します。testtestsourceSet

    sourceSets {
        integrationTest {
            compileClasspath += sourceSets.test.runtimeClasspath
            runtimeClasspath += sourceSets.test.runtimeClasspath // ***)
        }
    }
    • )どういうわけかこの再宣言/拡張sourceSets.integrationTest.runtimeClasspathが必要ですが、runtimeClasspath常に展開されるため、無関係にしてoutput + runtimeSourceSetください。取得しないでください。
  3. 統合テストを実行するだけの専用タスクを定義します。

    task integrationTest(type: Test) {
    }
  4. integrationTest使用するテストクラスとクラスパスを設定します。javaプラグインのデフォルトでは、test sourceSet

    task integrationTest(type: Test) {
        testClassesDir = sourceSets.integrationTest.output.classesDir
        classpath = sourceSets.integrationTest.runtimeClasspath
    }
  5. (オプション)テスト後に自動実行

    integrationTest.dependsOnテスト
    

  6. (オプション)依存関係を追加しますcheck(そのため、常に実行されるbuildcheck実行されます)

    tasks.check.dependsOn(tasks.integrationTest)
  7. (省略可能) java、resourcesをに追加して、sourceSet自動検出をサポートし、IDEでこれらの「部分」を作成します。すなわち、IntelliJ IDEA sourceSetは、存在しない場合、セットごとにディレクトリjavaおよびリソースを自動作成します。

    sourceSets {
         integrationTest {
             java
             resources
         }
    }

tl; dr

apply plugin: 'java'

// apply the runtimeClasspath from "test" sourceSet to the new one
// to include any needed assets: test, main, test-dependencies and main-dependencies
sourceSets {
    integrationTest {
        // not necessary but nice for IDEa's
        java
        resources

        compileClasspath += sourceSets.test.runtimeClasspath
        // somehow this redeclaration is needed, but should be irrelevant
        // since runtimeClasspath always expands compileClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath
    }
}

// define custom test task for running integration tests
task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
tasks.integrationTest.dependsOn(tasks.test)

参照:

残念ながら、上の例のコードgithub.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle... /のGradle / ... / withIntegrationTests / build.gradleは、これを処理していないと思われるか、別のを持っています/より複雑/とにかく私には明確な解決策はありません!


1
(!)結局のところ、構成または出力なしでsourceSetの拡張機能を1回使用すると、最初にプロジェクトを開いた後、アイデアでメイクエラーが発生します。(ここでは:テスト)のビルド依存性(ここでは:integrationTest)新しい「モジュール」については、最初の時には使用できませんcompileTestJava
childno͡.de

2
classesDirclassesDirs
Gradle

時代遅れとヒント@deFreitasのためのおかげで、私は答えをマーク
childno͡.de


7

使用している場合

IntelliJにカスタムソースセットをテストソースルートとして認識させるには:

plugin {
    idea
}

idea {
    module {
        testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
        testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
    }
}

2

Gradle 4.0の時点で私が機能するのは次のとおりです。

sourceSets {
  integrationTest {
    compileClasspath += sourceSets.test.compileClasspath
    runtimeClasspath += sourceSets.test.runtimeClasspath
  }
}

task integrationTest(type: Test) {
  description = "Runs the integration tests."
  group = 'verification'
  testClassesDirs = sourceSets.integrationTest.output.classesDirs
  classpath = sourceSets.integrationTest.runtimeClasspath
}

バージョン4.0以降、Gradleはソースセット内の言語ごとに個別のクラスディレクトリを使用するようになりました。したがって、ビルドスクリプトでを使用sourceSets.integrationTest.output.classesDirしている場合は、次の非推奨の警告が表示されます。

Gradleは、JVM言語ごとに個別の出力ディレクトリを使用するようになりましたが、このビルドは、ソースセットのすべてのクラスに対して単一のディレクトリを想定しています。この動作は廃止されており、Gradle 5.0で削除される予定です。

この警告を取り除くには、sourceSets.integrationTest.output.classesDirs代わりに切り替えます。詳細については、Gradle 4.0リリースノートを参照してください。


<hmm>に切り替える?? あなたの前と後は同じです。
Merk

0

Gradleを初めて使用し、Gradle 6.0.1 JUnit 4.12を使用しています。これが私がこの問題を解決するために思いついたものです。

apply plugin: 'java'
repositories { jcenter() }

dependencies {
    testImplementation 'junit:junit:4.12'
}

sourceSets {
  main {
    java {
       srcDirs = ['src']
    }
  }
  test {
    java {
      srcDirs = ['tests']
    }
  }
}

メインソースとテストソースを別々に参照されている旨の通知、下1 mainと一つ下test

testImplementation下の項目dependenciesは、でソースをコンパイルするためにのみ使用されtestます。あなたのメインのコードは、実際のJUnitへの依存性を持っていた場合、あなたはまた、指定しますimplementationdependencies

repositoriesこれを機能させるにはセクションを指定する必要がありましたが、それが最善の/唯一の方法であるとは思えません。

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