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
Đ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
}
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
Cảm ơn bạn đã chia sẻ! Thật tốt khi xem các triển khai thay thế. – Spina
khi 'java { srcDir 'src/integrationtest/java' } nguồn { srcDir 'src/integrationtest/nguồn' } 'là không phù hợp vì nó chỉ redeclares' src/
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:
trước tiên, chúng tôi cần xác định nguồn:
sourceSets { integrationTest }
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ó
- *** 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
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) { }
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 }
(không bắt buộc) tự động chạy sau khi kiểm tra
integrationTest.dependsOn test
(tùy chọn) tự động chạy với kiểm tra
check.dependsOn integrationTest
(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:
- gradle java chapter 45.7.1. Source set properties
- gradle java chapter 45.7.3. Some source set examples
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!
(!) 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 –
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à:
Đâ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.
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 đủ. –
Cảm ơn @PeterNiederwieser Tôi đã sửa tập lệnh tạo mẫu của mình. – Spina
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 :) –