113

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

4

8 に答える 8

134

2021年の更新:

8年で多くの変化がありました。Gradleは引き続き優れたツールです。これで、統合テストの構成専用のセクション全体がドキュメントにあります。今すぐドキュメントを読むことをお勧めします。

元の回答:

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

これは、メインおよびテストソースセットに加えて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
}
于 2012-07-20T14:30:47.770 に答える
35

これが、を使用せずにこれを達成した方法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
}

使用してテスト済み: Gradle1.4およびGradle1.6

于 2013-05-29T16:34:43.993 に答える
24

これはかつて2016年にGradle2.x/ 3.x用に作成されたもので、はるかに時代遅れですGradle4以降で文書化されたソリューションをご覧ください


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

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

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

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

    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のサンプルコードはこれを処理していないか、異なるものがあります/より複雑/私にとってはとにかく明確な解決策はありません!

于 2016-06-17T12:49:53.720 に答える
10

nebula-facetプラグインは、定型文を排除します。

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

特に統合テストの場合、これもあなたのために行われます。適用するだけです。

apply plugin: 'nebula.integtest'

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

  1. nebula.facet
  2. nebula.integtest
于 2016-08-09T18:03:46.200 に答える
7

使用している場合

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

plugin {
    idea
}

idea {
    module {
        testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
        testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
    }
}
于 2019-02-14T17:02:19.540 に答える
2

Gradle4.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言語ごとに個別の出力ディレクトリを使用するようになりましたが、このビルドでは、ソースセットのすべてのクラスに対して単一のディレクトリを想定しています。この動作は非推奨になり、Gradle5.0で削除される予定です。

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

于 2017-08-02T15:31:34.113 に答える
1

この質問が出された2012年にはドキュメントはあまり良くありませんでしたが、2020年以降にこれを読んでいる人のために:統合テスト用のソースセットを追加する方法についてのセクション全体がドキュメントにあります。ここでコードスニペットをコピーして貼り付けて壁に頭をぶつけて、2012年から2016年の回答がうまくいかない理由を理解するのではなく、実際に読んでください。

答えはおそらく単純ですが、あなたが思っているよりも微妙なニュアンスがあり、必要な正確なコードは、私が必要とするコードとは異なる可能性があります。たとえば、統合テストで単体テストと同じ依存関係を使用しますか?

于 2020-12-28T11:19:31.003 に答える
-1

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

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

dependencies {
    testImplementation 'junit:junit:4.12'
}

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

メインソースとテストソースが別々に参照されていることに注意してください。1つはアンダーmain、もう1つはアンダーtestです。

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

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

于 2019-12-23T16:46:21.717 に答える