2012-07-20 33 views
61

Tôi muốn thêm các bài kiểm tra tích hợp vào bản dựng Gradle của tôi (Phiên bản 1.0). Chúng phải chạy riêng biệt với các kiểm tra bình thường của tôi vì chúng yêu cầu một webapp được triển khai tới localhost (chúng kiểm tra webapp đó). Các bài kiểm tra sẽ có thể sử dụng các lớp được định nghĩa trong bộ nguồn chính của tôi. Làm cách nào để tôi thực hiện điều này?Làm cách nào để thêm nguồn mới vào Gradle?

Trả lời

87

Điều này đã cho tôi một thời gian để tìm ra và các nguồn tài nguyên trực tuyến không tuyệt vời. Vì vậy, tôi muốn ghi lại giải pháp của mình.

Đây là một đơn giản gradle xây dựng kịch bản mà có nguồn intTest thiết lập ngoài các bộ chính và nguồn kiểm tra:

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

Bạn vẫn cần khai báo và định cấu hình nhiệm vụ kiểm tra tích hợp. Về mặt tài liệu, có một mẫu 'java/withIntegrationTests' trong phân phối Gradle đầy đủ. –

+0

Cảm ơn @PeterNiederwieser Tôi đã sửa tập lệnh tạo mẫu của mình. – Spina

+2

Tôi đã cố gắng để làm điều này cũng ... cảm ơn bạn rất nhiều vì đã đăng giải pháp :) –

26

Dưới đây là làm thế nào tôi đạt được điều này mà không sử dụng 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 
} 

Tested sử dụng: Gradle 1.4 và Gradle 1,6

+2

Cảm ơn bạn đã chia sẻ! Thật tốt khi xem các triển khai thay thế. – Spina

+1

khi 'java { srcDir 'src/integrationtest/java' } nguồn { srcDir 'src/integrationtest/nguồn' } 'là không phù hợp vì nó chỉ redeclares' src//...' để 'src/integrationtest/...': ở đây: thay đổi vốn T thành một t thấp hơn –

9

Tóm lại cả câu trả lời cũ (có được tốt nhất và tối thiểu khả thi của cả hai thế giới):

một số lời ấm áp đầu tiên:

  1. trước tiên, chúng tôi cần xác định nguồn:

     
    sourceSets { 
        integrationTest 
    } 
    

  2. tiếp theo chúng tôi mở rộng sourceSet từ kiểm tra, do chúng tôi sử dụng runtimeClasspath kiểm tra (bao gồm tất cả DEPS từ kiểm tra và thử nghiệm bản thân) như classpath cho nguồn gốc sourceSet

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

    • *** note) bằng cách nào đó này khai báo lại/mở rộng cho sourceSets.integrationTest.runtimeClasspath là cần thiết, nhưng nên không thích hợp kể từ runtimeClasspath luôn mở rộng output + runtimeSourceSet, không nhận được nó
  3. chúng ta định nghĩa một nhiệm vụ dành riêng cho chỉ chạy thử nghiệm hội nhập

     
    task integrationTest(type: Test) { 
    } 
    

  4. nói công việc thử nghiệm mà các lớp học thử nghiệm và classpaths nên được sử dụng thay vì giá trị mặc định từ "test" sourceset

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

  5. (không bắt buộc) tự động chạy sau khi kiểm tra

     
    integrationTest.dependsOn test 
    

  6. (tùy chọn) tự động chạy với kiểm tra

     
    check.dependsOn integrationTest 
    

  7. (tùy chọn) thêm java, tài nguyên vào sourceSet để cho phép tự động phát hiện và tạo các "partials" này trong IDE của bạn. I E.IntelliJ IDEA sẽ tự động tạo ra thư mục sourceSet java và nguồn lực cho mỗi bộ nếu nó không tồn tại

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

đề cập đến:

tiếc, mã ví dụ trên github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle hoặc …/gradle/…/withIntegrationTests/build.gradle dường như không để xử lý này hoặc có một phức tạp hơn đối với tôi giải pháp không rõ ràng khác nhau// anyway!

+1

(!) khi nó quay ra, việc sử dụng duy nhất các cải tiến sourceSet mà không có cấu hình hoặc kết quả đầu ra trong một lỗi tạo ra trong ý tưởng sau khi bắt đầu mở một dự án. phụ thuộc xây dựng (ở đây: kiểm tra) cho "mô đun" mới (ở đây: integrationTest) không khả dụng khi 'compileTestJava' đầu tiên –

6

Plugin nebula-facet loại bỏ sự soạn sẵn:

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

Đối với thử nghiệm hội nhập đặc biệt, thậm chí this is done for you, chỉ cần áp dụng:

apply plugin: 'nebula.integtest' 

Các Gradle liên kết Cổng plugin cho mỗi là:

  1. nebula.facet
  2. nebula.integtest
0

Đây là những gì làm việc cho tôi như của 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 
} 

Kể từ phiên bản 4.0, Gradle hiện sử dụng các thư mục lớp riêng biệt cho từng ngôn ngữ trong bộ nguồn. Vì vậy, nếu tập lệnh xây dựng của bạn sử dụng sourceSets.integrationTest.output.classesDir, bạn sẽ thấy cảnh báo không dùng nữa sau.

Bây giờ Gradle sử dụng các thư mục đầu ra riêng biệt cho mỗi ngôn ngữ JVM, nhưng xây dựng này giả định một thư mục duy nhất cho tất cả các lớp từ tập hợp nguồn. Hành vi này đã không được chấp nhận và được lên lịch để xóa trong Gradle 5.0

Để loại bỏ cảnh báo này, chỉ cần chuyển sang sourceSets.integrationTest.output.classesDirs thay thế. Để biết thêm thông tin, hãy xem Gradle 4.0 release notes.

Các vấn đề liên quan