Ini membutuhkan waktu beberapa saat bagi saya untuk mencari tahu dan sumber daya daring tidak bagus. Jadi saya ingin mendokumentasikan solusi saya.
Ini adalah skrip build gradle sederhana yang memiliki kumpulan sumber intTest selain set utama dan sumber pengujian:
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
}
java/withIntegrationTests
contoh dalam distribusi Gradle lengkap.Inilah cara saya mencapai ini tanpa menggunakan
configurations{ }
.Diuji menggunakan: Gradle 1.4 dan Gradle 1.6
sumber
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }
tidak relevan karena hanya menyatakan kembalisrc/<sourceSetName>/...
kesrc/integrationtest/...
: di sini: mengubah ibukota T ke t yang lebih rendahcompileClasspath += sourceSets.main.runtimeClasspath
menggabungkan dua set file. Tidak ada resolusi konflik biasa untuk dependensi. Anda bisa mendapatkan dua versi dari pustaka yang sama. Memperluas konfigurasi akan membantu dengan itu.Untuk meringkas kedua jawaban lama (dapatkan yang terbaik dan minimum yang layak dari kedua dunia):
beberapa kata hangat terlebih dahulu:
pertama, kita perlu mendefinisikan
sourceSet
:selanjutnya kami memperluas
sourceSet
daritest
, untuk itu kami menggunakantest.runtimeClasspath
(yang mencakup semua ketergantungan daritest
ANDtest
itu sendiri) sebagai jalur kelas untuk turunansourceSet
:sourceSets.integrationTest.runtimeClasspath
ini diperlukan, tetapi harus tidak relevan karenaruntimeClasspath
selalu berkembangoutput + runtimeSourceSet
, jangan mengertikami mendefinisikan tugas khusus hanya untuk menjalankan tes integrasi:
Konfigurasikan
integrationTest
kelas pengujian dan penggunaan classpath. Default darijava
plugin menggunakantest
sourceSet
(opsional) otomatis dijalankan setelah pengujian
(opsional) tambahkan ketergantungan dari
check
(sehingga selalu berjalan saatbuild
ataucheck
dijalankan)(opsional) tambahkan java, resource ke
sourceSet
untuk mendukung deteksi otomatis dan buat "parsial" ini di IDE Anda. yaitu IntelliJ IDEA akan otomatis membuatsourceSet
direktori java dan resource untuk setiap set jika tidak ada:tl; dr
mengacu:
Sayangnya, kode contoh di github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle atau … / gradle /… / withIntegrationTests / build.gradle tampaknya tidak menangani ini atau memiliki perbedaan / lebih kompleks / bagi saya tidak ada solusi yang lebih jelas!
sumber
compileTestJava
classesDir
dimigrasi keclassesDirs
pada kelas 5The nebula-facet Plugin eliminasi boilerplate:
Khusus untuk pengujian integrasi, meskipun ini sudah dilakukan untuk Anda , cukup terapkan:
Tautan portal plugin Gradle untuk masing-masing adalah:
sumber
Jika Anda menggunakan
Untuk membuat IntelliJ mengenali kumpulan sumber khusus sebagai root sumber pengujian:
sumber
Inilah yang berhasil untuk saya sejak Gradle 4.0.
Mulai versi 4.0, Gradle sekarang menggunakan direktori kelas terpisah untuk setiap bahasa dalam kumpulan sumber. Jadi, jika skrip build Anda menggunakan
sourceSets.integrationTest.output.classesDir
, Anda akan melihat peringatan penghentian berikut.Untuk menghilangkan peringatan ini, alihkan saja ke
sourceSets.integrationTest.output.classesDirs
. Untuk informasi selengkapnya, lihat catatan rilis Gradle 4.0 .sumber
Saya baru mengenal Gradle, menggunakan Gradle 6.0.1 JUnit 4.12. Inilah yang saya temukan untuk menyelesaikan masalah ini.
Perhatikan bahwa sumber utama dan sumber pengujian direferensikan secara terpisah, satu di bawah
main
dan satu di bawahtest
.The
testImplementation
Item di bawahdependencies
hanya digunakan untuk mengkompilasi sumber ditest
. Jika kode utama Anda benar-benar memiliki ketergantungan pada JUnit, Anda juga harus menentukanimplementation
bawahdependencies
.Saya harus menentukan
repositories
bagian agar ini berfungsi, saya ragu itu adalah cara terbaik / satu-satunya.sumber