2012-07-20 58 views
61

我想添加集成測試到我的Gradle版本(版本1.0)。它們應該與我的正常測試分開運行,因爲它們需要將Web應用程序部署到本地主機(他們測試該Web應用程序)。測試應該能夠使用我的主要源集中定義的類。我如何做到這一點?如何添加一個新的源代碼到Gradle?

回答

87

這花了我一段時間才弄清楚,在線資源並不是很好。所以我想記錄我的解決方案。

這是一個具有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 
} 
+5

您仍然需要聲明和配置集成測試任務。在文檔方面,完整的Gradle發行版中有一個'java/withIntegrationTests'樣例。 – 2012-07-20 15:09:45

+0

感謝@PeterNiederwieser我已更正我的示例生成腳本。 – Spina 2012-07-23 13:45:03

+2

我試圖做到這一點以及...非常感謝你張貼解決方案:) – 2012-10-15 11:15:05

26

這是我如何實現這不使用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 
} 

使用測試:搖籃1.4和搖籃1.6

+2

感謝分享!很高興看到其他實現。 – Spina 2013-06-03 18:35:52

+1

而'{java的 SRCDIR「SRC/integrationtest/Java的 } 資源{ SRCDIR 'SRC/integrationtest /資源' }'是不相關的,因爲它只是redeclares'SRC//...'來'src/integrationtest/...':這裏:將資本T改爲更低的t – 2016-06-17 07:39:42

9

綜上所述既古老答案(得到最好的和最小可行兩全其美):

一些溫暖的話第一:

  1. 首先,我們需要定義sourceSet:

     
    sourceSets { 
        integrationTest 
    } 
    

  2. 下一個

    我們從測試擴大sourceSet,爲此我們使用測試runtimeClasspath(其中包括從測試的所有DEPS和測試本身)的類路徑派生sourceSet

     
    sourceSets { 
        integrationTest { 
         compileClasspath += sourceSets.test.runtimeClasspath 
         runtimeClasspath += sourceSets.test.runtimeClasspath // ***) 
        } 
    } 
    

    • ***注)這種莫名其妙對於sourceSets.integrationTest.runtimeClasspath重複宣告/擴展是必要的,但應該是無關緊要的,因爲runtimeClasspath總是擴展output + runtimeSourceSet,不明白這一點
  3. 我們定義了一個專門的任務只是運行集成測試

     
    task integrationTest(type: Test) { 
    } 
    

  4. 知道哪些測試類和類路徑,而應使用默認設置從 「測試」 sourceset測試作業

     
    task integrationTest(type: Test) { 
        testClassesDir = sourceSets.integrationTest.output.classesDir 
        classpath = sourceSets.integrationTest.runtimeClasspath 
    } 
    

  5. (可選)自動運行後測試

     
    integrationTest.dependsOn test 
    

  6. (可選)自動運行檢查

     
    check.dependsOn integrationTest 
    

  7. (可選)將java資源添加到sourceSet以允許自動檢測並在您的IDE中創建這些「偏好」。即IntelliJ IDEA的自動創建一個sourceSet目錄java和資源爲每套如果不存在

     
    sourceSets { 
        integrationTest { 
         java 
         resources 
        } 
    } 
    

TL它;博士

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 
} 
integrationTest.dependsOn test 

指:

不幸的是,在github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle…/gradle/…/withIntegrationTests/build.gradle示例代碼似乎沒有處理這個還是有不同的/更復雜的/我沒有清晰的解決方案呢!

+1

(!),事實證明,在沒有配置或輸出的情況下單獨使用sourceSet增強會導致在初始打開項目。第一個「compileTestJava」不支持新的「模塊」(這裏是:integrationTest)的構建依賴關係(這裏是:test) – 2016-08-01 13:20:02

0

從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 release notes

相關問題