Saya memiliki konfigurasi multi-proyek dan saya ingin menggunakan gradle.
Proyek saya seperti ini:
Proyek A
- ->
src/main/java
- ->
src/test/java
- ->
Proyek B
- ->
src/main/java
(tergantungsrc/main/java
pada Proyek A ) - ->
src/test/java
(tergantungsrc/test/java
pada Proyek A )
- ->
File Project B saya build.gradle
seperti ini:
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
Tugas compileJava
pekerjaan besar tetapi compileTestJava
tidak mengkompilasi file tes dari Project A .
Jawaban:
Tidak digunakan lagi - Untuk Gradle 5.6 ke atas gunakan jawaban ini .
Di Proyek B , Anda hanya perlu menambahkan
testCompile
ketergantungan:Diuji dengan Gradle 1.7.
sumber
gradle testClasses
sebelum struktur bangunan benar-benar valid. Misalnya plugin Eclipse tidak akan membiarkan Anda mengimpor proyek sebelumnya. SayangtestCompile project(':A')
sekali tidak bekerja. @ DavidPärsson: "Gradle 1.3" bertentangan "tidak lagi" sejak Fesler diuji dengan Gradle 1.7.Cara sederhana adalah menambahkan ketergantungan tugas eksplisit di ProjectB:
Cara sulit (tetapi lebih jelas) adalah membuat konfigurasi artefak tambahan untuk ProjectA:
dan tambahkan
testCompile
ketergantungan untuk ProjectBsumber
testArtifacts
konfigurasi seperti ini:configurations { testArtifacts }
untuk lebih jelasnya lihat bagian bantuan Gradle inifrom sourceSets.test.output
dan mungkinclassifier = 'tests'
di tempat// pack whatever you need...
dalam jawabanIni sekarang didukung sebagai fitur kelas satu di Gradle. Modul dengan
java
ataujava-library
plugin juga dapat menyertakan sebuahjava-test-fixtures
plugin yang memaparkan kelas pembantu dan sumber daya untuk dikonsumsi bersamatestFixtures
pembantu. Manfaat dari pendekatan ini terhadap artefak dan pengklasifikasi adalah:Contoh
:modul:one
modul / one / build.gradle
modul / one / src / testFixtures / java / com / example / Helper.java
:modul:other
modul / other / build.gradle
modul / other / src / test / java / com / example / other / SomeTest.java
Bacaan lebih lanjut
Untuk info lebih lanjut, lihat dokumentasi:
https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
Itu ditambahkan dalam 5.6:
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects
sumber
Saya sendiri telah menemukan masalah ini baru-baru ini, dan manusia adalah masalah sulit untuk menemukan jawaban.
Kesalahan yang Anda buat adalah berpikir bahwa suatu proyek harus mengekspor elemen pengujiannya dengan cara yang sama seperti ia mengekspor artefak dan dependensi utamanya.
Apa yang saya lebih sukses secara pribadi adalah membuat proyek baru di Gradle. Dalam contoh Anda, saya akan menyebutkannya
Project A_Test -> src / main / java
Saya akan memasukkan ke dalam src / main / java file yang saat ini Anda miliki di Project A / src / test / java. Buat setiap dependensi testCompile dari Proyek Anda, kompilasi dependensi dari Project A_Test.
Kemudian buat Project A_Test sebuah dependensi testCompile dari Project B.
Itu tidak logis ketika Anda datang dari sudut pandang penulis kedua proyek, tapi saya pikir itu masuk akal ketika Anda berpikir tentang proyek-proyek seperti junit dan scalatest (dan lain-lain. Meskipun kerangka kerja tersebut terkait pengujian, mereka tidak dianggap sebagai bagian dari target "test" dalam kerangka kerja mereka sendiri - mereka menghasilkan artefak utama yang kebetulan digunakan oleh proyek lain dalam konfigurasi pengujian mereka. Anda hanya ingin mengikuti pola yang sama.
Mencoba melakukan jawaban lain yang tercantum di sini tidak bekerja untuk saya secara pribadi (menggunakan Gradle 1.9), tetapi saya telah menemukan bahwa pola yang saya jelaskan di sini adalah solusi yang lebih bersih.
sumber
Saya tahu ini adalah pertanyaan lama tetapi saya hanya memiliki masalah yang sama dan menghabiskan waktu mencari tahu apa yang sedang terjadi. Saya menggunakan Gradle 1.9. Semua perubahan harus dalam ProjectB
build.gradle
Untuk menggunakan kelas uji dari ProjectA dalam tes ProjectB:
Untuk memastikan bahwa
sourceSets
properti tersedia untuk ProjectA:Untuk memastikan kelas tes dari ProjectA benar-benar ada, ketika Anda mengkompilasi ProjectB:
sumber
.classesDir
.Solusi testJar baru (didukung dependensi trnsitif) tersedia sebagai plugin gradle:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
Dari dokumentasi
sumber
Could not get unknown property 'testClasses' for project ':core' of type org.gradle.api.Project.
Silakan baca pembaruan di bawah.
Masalah serupa yang dijelaskan oleh JustACluelessNewbie terjadi di IntelliJ IDEA. Masalahnya adalah bahwa ketergantungan
testCompile project(':core').sourceSets.test.output
sebenarnya berarti: "bergantung pada kelas yang dihasilkan oleh tugas pembangunan gradle". Jadi, jika Anda membuka proyek bersih di mana kelas tidak dihasilkan namun IDEA tidak akan mengenalinya dan melaporkan kesalahan.Untuk memperbaiki masalah ini, Anda harus menambahkan ketergantungan pada file sumber tes di samping ketergantungan pada kelas yang dikompilasi.
Anda dapat mengamati dependensi yang dikenali oleh IDEA dalam Pengaturan Modul -> Ketergantungan (lingkup pengujian) .
Btw. ini bukan solusi yang bagus sehingga refactoring patut dipertimbangkan. Gradle sendiri memiliki sub-proyek khusus yang hanya berisi kelas-kelas dukungan tes. Lihat https://docs.gradle.org/current/userguide/test_kit.html
Perbarui 2016-06-05 Lebih Banyak Saya berpikir tentang solusi yang diusulkan kurang saya suka. Ada beberapa masalah dengan itu:
Jadi apa solusi yang lebih baik? Menurut pendapat saya itu menciptakan set sumber kustom baru dan menempatkan kelas bersama ke dalamnya. Sebenarnya penulis proyek Gradle melakukannya dengan membuat set sumber testFixtures.
Untuk melakukannya Anda hanya perlu:
Menyatakan ketergantungan yang tepat dalam proyek tergantung:
sumber
Solusi Fesler tidak berhasil untuk saya, ketika saya mencobanya untuk membangun proyek android (gradle 2.2.0). Jadi saya harus referensi kelas yang diperlukan secara manual:
sumber
@VisibleForTesting
aturan serat. Anda tidak akan dapat memanggil metode seperti itu dari modul reguler di bawah folder tidak pengujian.Saya sangat terlambat ke pesta (sekarang Gradle v4.4) tetapi untuk siapa pun yang menemukan ini:
Asumsi:
Pergi ke build.gradle proyek B (yang membutuhkan beberapa kelas uji dari A) dan tambahkan yang berikut ini:
atau (dengan asumsi proyek Anda bernama "ProjectB")
Voila!
sumber
Jika Anda memiliki dependensi tiruan yang perlu Anda bagikan di antara tes, Anda dapat membuat proyek baru
projectA-mock
dan kemudian menambahkannya sebagai dependensi tes keProjectA
danProjectB
:Ini adalah solusi yang jelas untuk dependensi berbagi pura-pura, tapi jika Anda perlu untuk menjalankan tes dari
ProjectA
dalamProjectB
penggunaan solusi lain.sumber
Jika ingin digunakan dependensi artifak untuk memiliki:
maka bagian dependensi ProjectB di build.gradle akan terlihat seperti ini:
Agar ini berfungsi, ProjectA perlu membangun a toples- uji dan memasukkannya ke dalam artefak yang dihasilkannya.
Build.gradle ProjectA harus berisi konfigurasi seperti ini:
Ketika artefak ProjectA dipublikasikan ke artifactory Anda, mereka akan menyertakan- pengujian toples- .
The testCompile pada bagian dependensi ProjectB akan membawa kelas di -tests jar.
Jika Anda ingin menyertakan sumber dan kelas uji ProjectAFlat di ProjectB untuk tujuan pengembangan maka bagian dependensi di build.gradle ProjectB akan terlihat seperti ini:
sumber
println(configurations.joinToString("\n") { it.name + " - " + it.allDependencies.joinToString() })
(dalam kotlin buildscript), saya menentukan konfigurasi mana yang masih ada dan memiliki dependensi, tetapi untuk semua Gradle ini dikeluhkan:Selected configuration 'testCompileClasspath' on 'project :sdk' but it can't be used as a project dependency because it isn't intended for consumption by other components.
Beberapa jawaban lain menyebabkan kesalahan satu atau lain cara - Gradle tidak mendeteksi kelas uji dari proyek lain atau proyek Eclipse memiliki dependensi yang tidak valid ketika diimpor. Jika ada yang memiliki masalah yang sama, saya sarankan pergi dengan:
Baris pertama memaksa Eclipse untuk menghubungkan proyek lain sebagai ketergantungan, sehingga semua sumber disertakan dan terkini. Yang kedua memungkinkan Gradle untuk benar-benar melihat sumber, sementara tidak menyebabkan kesalahan ketergantungan yang tidak valid seperti yang
testCompile project(':core').sourceSets.test.output
dilakukan.sumber
Di sini jika Anda menggunakan Kotlin DSL , Anda harus membuat tugas Anda seperti itu menurut dokumentasi Gradle .
Seperti beberapa jawaban sebelumnya, Anda perlu membuat konfigurasi khusus di dalam proyek yang akan membagikan kelas tesnya, sehingga Anda tidak mencampur tes dan kelas utama.
Langkah sederhana
build.gradle.kts
:build.gradle.kts
:sumber
dalam proyek B:
Tampaknya bekerja di 1.7-rc-2
sumber