web-dev-qa-db-ja.com

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

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

81
Spina

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

これは、メインおよびテストソースセットに加えて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
}
101
Spina

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

29
Mike Rylander

これは2016年にGradle 2.x/3.x用に一度書かれたもので、はるかに時代遅れです!!ご覧ください Gradle 4以降で文書化されたソリューションで


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

最初にいくつかの暖かい言葉:

  1. まず、sourceSetを定義する必要があります。

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

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

    task integrationTest(type: Test) {
    }
    
  4. integrationTestテストクラスとクラスパスの使用を構成します。 Javaプラグインのデフォルトでは、testsourceSetを使用します

    task integrationTest(type: Test) {
        testClassesDir = sourceSets.integrationTest.output.classesDir
        classpath = sourceSets.integrationTest.runtimeClasspath
    }
    
  5. (オプション)auto run aftertest

     integrationTest.dependsOn test 
    
  6. (オプション)checkから依存関係を追加します(したがって、buildまたはcheckが実行されるときに常に実行されます)

    tasks.check.dependsOn(tasks.integrationTest)
    
  7. (オプション)Java、リソースを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 はこれを処理していないようであるか、異なる/より複雑です/とにかく明確な解決策はありません!

16
childno͡.de

nebula-facet プラグインは定型文を削除します:

apply plugin: 'nebula.facet'
facets {
    integrationTest {
        parentSourceSet = 'test'
    }
}

特に統合テストの場合、 これはあなたのために行われます でさえ、単に適用します:

apply plugin: 'nebula.integtest'

それぞれのGradleプラグインポータルリンクは次のとおりです。

  1. nebula.facet
  2. nebula.integtest
7
jkschneider

使用している場合

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

plugin {
    idea
}

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

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リリースノート を参照してください。

1
Ryan Sobol