Saya sudah menyiapkan skrip nilai saya. Ketika saya menjalankan Gradle build, semuanya berfungsi dan ia menjalankan tes jUnit.
Setelah itu ketika saya menjalankan tes Gradle saya mendapatkan yang berikut:
C:\Users\..\..\Project>gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
Ketika saya melakukan gradle clean
, maka Gradle build berfungsi, tentu saja ... Saya ingin dapat mereset hanya tes, bukan membangun keseluruhan proyek: bagaimana saya harus melakukan ini?
java
gradle
build.gradle
USer22999299
sumber
sumber
Jawaban:
Salah satu opsi akan menggunakan
--rerun-tasks
bendera di baris perintah . Ini akan menjalankan kembali semua tugas tes dan semua tugas yang bergantung padanya.Jika Anda hanya tertarik untuk menjalankan kembali tes, maka pilihan lain adalah membuat gradle membersihkan hasil tes sebelum menjalankan tes. Ini dapat dilakukan dengan menggunakan
cleanTest
tugas.Beberapa latar belakang - plugin Java mendefinisikan tugas bersih untuk masing-masing tugas lainnya. Menurut dokumentasi :
Karena itu, yang Anda butuhkan untuk menjalankan kembali tes Anda adalah menjalankan
cleanTest
tugas, yaitu:gradle cleanTest test
sumber
gradle cleanTest test
tidak menjalankan kembali tes, itu membersihkan output mereka, tetapitest
tugas itu masih akan mendapatkan hasil tes dari cache - lihat github.com/gradle/gradle/issues/9153--no-build-cache
, maka itu akan berfungsi seperti yang diharapkan, misalnyagradle cleanTest test --no-build-cache
.Opsi lain adalah menambahkan berikut ini di build.gradle Anda:
sumber
funcTest
tugas yang saya buat untuk menjalankan tes fungsional.upToDateWhen
dapat digunakan dengan cara "kode-driven" seperti sifat sistem, variabel lingkungan, proyek properti, dllgradle test -Prerun-tests
. Kode dalam build.gradle:if(project.hasProperty("rerun-tests")) { test.outputs.upToDateWhen {false} }
gradle test --rerun-tasks
Sumber: https://gradle.org/docs/current/userguide/gradle_command_line.html
sumber
Ini baru-baru ini menjadi topik di postingan blog Gradle, Berhenti mengulang tes Anda . The Penulis menunjukkan contoh menggunakan
outputs.upToDateWhen { false }
dan menjelaskan mengapa itu salah:Kemudian, penulis melanjutkan untuk menjelaskan mengapa menjalankan kembali beberapa tes adalah buang-buang waktu:
Dalam beberapa kasus di mana Anda ingin menjalankan kembali tes di mana kode tidak berubah, Anda harus memodelkannya sebagai input. Berikut adalah kedua contoh dari posting blog yang menunjukkan penambahan input sehingga tugas akan menggunakannya selama pemeriksaan terbaru.
Saya sarankan membaca seluruh posting blog.
sumber
Berikut ini solusi menggunakan file "build.gradle", jika Anda tidak ingin mengubah baris perintah Anda:
Dan inilah hasilnya. Perhatikan 2 perubahan dari output Anda sebelumnya:
1) Tugas 'cleanTest' baru muncul di output.
2) 'test' selalu dibersihkan (tidak pernah 'UP-TO-DATE') sehingga dieksekusi setiap kali:
sumber
cleanTest
sebelumtest
tidak akan menjalankan kembali tes, itu membersihkan output mereka, tetapi tugas tes masih akan mendapatkan hasil tes dari cache - lihat github.com/gradle/gradle/issues/9153--rerun-tasks
berfungsi, tetapi tidak efisien karena menjalankan kembali semua tugas.cleanTest
dengan sendirinya mungkin tidak cukup karena membangun cache.jadi, cara terbaik untuk mencapai ini adalah:
sumber
Juga, harus menambahkan
--rerun-tasks
benar-benar berlebihan. Tidak pernah terjadi. Buat--no-rerun-tasks
dan buat--rerun-tasks
default saatcleanTask
sumber
TL; DR
sumber
Saya pikir ini adalah pertanyaan yang valid mengingat bahwa memungkinkan Gradle menjalankan perintah ini
test
, dan yang terjadi adalah tidak ada yang terjadi!Tetapi saya akan mempertanyakan perlunya melakukan ini, seperti yang dikatakan Jolta dalam komentarnya: jika tidak ada kode yang berubah mengapa Anda perlu menguji ulang? Jika Anda ragu tentang input pihak ketiga, saya katakan Anda harus memenuhi ini dalam kode aplikasi Anda. Jika Anda khawatir kode Anda mungkin "tidak stabil", yaitu dapat lulus semua tes pertama kali tetapi tidak yang kedua (atau yang ke-100), tidakkah Anda perlu memikirkan mengapa Anda memiliki keraguan ini, dan mengatasinya?
Secara pribadi saya pikir ini adalah kesalahan desain (sangat kecil) di Gradle: jika semuanya benar-benar mutakhir, daripada menggunakan "BUILD SUCCESSFUL", ia seharusnya mengatakan "TIDAK BERUBAH SEJAK TAHUN TERAKHIR SUKSES BUILD BUILD: NOTHING DONE".
sumber