Mengingat jawabannya, harus jelas ini tentang tes lokal , bukan tes instrumen . Android / Gradle membuat segalanya membingungkan dengan menyebut tes lokal ini sebagai "unit" tes.
tir38
Jawaban:
562
Untuk menjalankan kelas tes tunggal, jawaban Airborn baik.
Dengan menggunakan beberapa opsi baris perintah, yang ditemukan di sini , Anda dapat melakukan sesuatu seperti ini.
gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests *SomeTest.someSpecificFeature
gradle test --tests *SomeSpecificTest
gradle test --tests all.in.specific.package*
gradle test --tests *IntegTest
gradle test --tests *IntegTest*ui*
gradle test --tests *IntegTest.singleMethod
gradle someTestTask --tests *UiTest someOtherTestTask --tests *WebTest*ui
Dari versi 1.10 gradle mendukung uji pilih, menggunakan filter uji . Sebagai contoh,
apply plugin: 'java'
test {
filter {
//specific test method
includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"
//specific test method, use wildcard for packages
includeTestsMatching "*SomeTest.someSpecificFeature"
//specific test class
includeTestsMatching "org.gradle.SomeTest"
//specific test class, wildcard for packages
includeTestsMatching "*.SomeTest"
//all classes in package, recursively
includeTestsMatching "com.gradle.tooling.*"
//all integration tests, by naming convention
includeTestsMatching "*IntegTest"
//only ui tests from integration tests, by some naming convention
includeTestsMatching "*IntegTest*ui"
}
}
Untuk lingkungan multi-rasa (kasus penggunaan umum untuk Android), periksa jawaban ini , karena --testsargumennya tidak didukung dan Anda akan mendapatkan kesalahan.
pendekatan filter kemungkinan juga dapat dikombinasikan dengan Aturan tugas untuk beberapa pilihan tes yang mudah
Matt Whipple
Untuk suite tes besar, bahkan jika menggunakan --testsuntuk memanggil metode tes tunggal di dalam kelas, maka kita melihat iterasi di semua kelas bahkan semua yang tidak dijalankan, yang terlalu lambat. Tidak tahu apakah kelambatan itu disebabkan oleh env kami atau apakah itu akan berdampak pada orang lain. Dapat memperbarui jika menemukan lebih banyak.
arntg
185
Anda dapat melakukannya gradle -Dtest.single=ClassUnderTestTest testjika Anda ingin menguji kelas tunggal atau menggunakan regexp seperti gradle -Dtest.single=ClassName*Test testAnda dapat menemukan lebih banyak contoh kelas penyaringan untuk tes di bawah bagian tautan ini 23.12. Uji.
Versi terbaru (mulai dari 1,10 atau lebih) mendukung --testsopsi baris perintah, yang diatur untuk diganti -DtestTaskName.single.
Peter Niederwieser
58
Dengan --testopsi ini, Anda juga dapat membatasi pengujian ke satu metode di dalam kelas pengujian Anda. Misalnya: gradle test --tests *MyTest.someMethod hanya akan menjalankan tes tunggal di someMethoddalam MyTestkelas Anda . Saat saya sedang membangun sebuah test case, saya biasanya menjalankan satu metode pada satu waktu untuk membuatnya lebih mudah untuk fokus hanya pada output yang saya butuhkan untuk debug, kemudian jalankan seluruh test case di akhir.
Jeff French
10
Juga perlu dicatat bahwa jika Anda ingin menjalankan tes tunggal dalam proyek multi-modul, maka perintahnya adalah gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Lihat diskusi ini di gradle.org
Bulat
2
Anda mungkin juga ingin menggunakan --no-rebuildopsi, misalnya gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testuntuk mencegah agar dependensi tidak dibangun kembali, dan pada gilirannya untuk menjalankan tes tunggal itu lebih cepat.
falconepl
2
Opsi ini sudah tidak digunakan lagi di Gradle 5
Eyal
108
Jika Anda memiliki proyek multi-modul:
katakanlah struktur modul Anda
root-module
-> a-module
-> b-module
dan tes (testToRun) yang ingin Anda jalankan adalah dalam b-module, dengan path lengkap: com.xyz.b.module.TestClass.testToRun
Karena di sini Anda tertarik untuk menjalankan tes dalam b-module, jadi Anda harus melihat tugas yang tersedia untuk b-module.
./gradlew :b-module:tasks
Perintah di atas akan mencantumkan semua tugas dalam b-module dengan deskripsi. Dan dalam kasus yang ideal, Anda akan memiliki tes tugas bernama untuk menjalankan tes unit dalam modul itu.
./gradlew :b-module:test
Sekarang, Anda telah mencapai titik untuk menjalankan semua tes dalam b-module, akhirnya Anda dapat meneruskan parameter ke tugas di atas untuk menjalankan tes yang cocok dengan pola jalur tertentu
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Ini akan menjalankan tugas tes untuk kedua modul a dan b, yang dapat mengakibatkan kegagalan karena tidak ada yang cocok dengan pola di atas dalam modul-a.
perintah ini tidak berfungsi untuk saya. > Kesalahan: Opsi baris perintah tidak dikenal '--tests'
Tarkik
31
Harap perhatikan bahwa --testsopsi mungkin tidak berfungsi jika Anda memiliki bangunan yang berbeda types/flavors(gagal dengan Unknown command-line option '--tests'). Dalam hal ini, perlu untuk menentukan tugas tes tertentu (misalnya, testProdReleaseUnitTestbukan hanya test)
Berlari ke dalam situasi yang tepat ini Terima kasih!
JPM
Bisakah Anda menguraikan contoh lengkap? Saya mencoba menjalankan 3 tes yang cocok dengan wildcard ./gradlew test --tests *testMyCollectionTake*dan saya tidak tahu bagaimana saya harus mengganti testdengan nama tes wildcarded
DanielCuadra
4
Di bawah ini adalah perintah untuk menjalankan kelas uji tunggal menggunakan gradlewopsi baris perintah:
Dalam kasus saya, peringatan kompiler java gerhana saya ditetapkan terlalu tinggi, dan gerhana tidak mengenali kelas saya sebagai valid untuk dieksekusi. Memperbarui pengaturan kompiler saya memperbaiki masalahnya. Anda dapat membaca lebih lanjut tentang hal ini di sini: anotasi-nonnull-tidak dapat diselesaikan
Jawaban:
Untuk menjalankan kelas tes tunggal, jawaban Airborn baik.
Dengan menggunakan beberapa opsi baris perintah, yang ditemukan di sini , Anda dapat melakukan sesuatu seperti ini.
Dari versi 1.10 gradle mendukung uji pilih, menggunakan filter uji . Sebagai contoh,
Untuk lingkungan multi-rasa (kasus penggunaan umum untuk Android), periksa jawaban ini , karena
--tests
argumennya tidak didukung dan Anda akan mendapatkan kesalahan.sumber
--tests
untuk memanggil metode tes tunggal di dalam kelas, maka kita melihat iterasi di semua kelas bahkan semua yang tidak dijalankan, yang terlalu lambat. Tidak tahu apakah kelambatan itu disebabkan oleh env kami atau apakah itu akan berdampak pada orang lain. Dapat memperbarui jika menemukan lebih banyak.Anda dapat melakukannya
gradle -Dtest.single=ClassUnderTestTest test
jika Anda ingin menguji kelas tunggal atau menggunakan regexp sepertigradle -Dtest.single=ClassName*Test test
Anda dapat menemukan lebih banyak contoh kelas penyaringan untuk tes di bawah bagian tautan ini 23.12. Uji.sumber
--tests
opsi baris perintah, yang diatur untuk diganti-DtestTaskName.single
.--test
opsi ini, Anda juga dapat membatasi pengujian ke satu metode di dalam kelas pengujian Anda. Misalnya:gradle test --tests *MyTest.someMethod
hanya akan menjalankan tes tunggal disomeMethod
dalamMyTest
kelas Anda . Saat saya sedang membangun sebuah test case, saya biasanya menjalankan satu metode pada satu waktu untuk membuatnya lebih mudah untuk fokus hanya pada output yang saya butuhkan untuk debug, kemudian jalankan seluruh test case di akhir.gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test
. Lihat diskusi ini di gradle.org--no-rebuild
opsi, misalnyagradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test
untuk mencegah agar dependensi tidak dibangun kembali, dan pada gilirannya untuk menjalankan tes tunggal itu lebih cepat.Jika Anda memiliki proyek multi-modul:
katakanlah struktur modul Anda
dan tes (testToRun) yang ingin Anda jalankan adalah dalam b-module, dengan path lengkap: com.xyz.b.module.TestClass.testToRun
Karena di sini Anda tertarik untuk menjalankan tes dalam b-module, jadi Anda harus melihat tugas yang tersedia untuk b-module.
Perintah di atas akan mencantumkan semua tugas dalam b-module dengan deskripsi. Dan dalam kasus yang ideal, Anda akan memiliki tes tugas bernama untuk menjalankan tes unit dalam modul itu.
Sekarang, Anda telah mencapai titik untuk menjalankan semua tes dalam b-module, akhirnya Anda dapat meneruskan parameter ke tugas di atas untuk menjalankan tes yang cocok dengan pola jalur tertentu
Sekarang, alih-alih ini jika Anda menjalankan
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Ini akan menjalankan tugas tes untuk kedua modul a dan b, yang dapat mengakibatkan kegagalan karena tidak ada yang cocok dengan pola di atas dalam modul-a.
sumber
./gradlew :b-module:test --tests testToRun
Setelah banyak mencari tahu, yang berikut ini berhasil untuk saya:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
sumber
Harap perhatikan bahwa
--tests
opsi mungkin tidak berfungsi jika Anda memiliki bangunan yang berbedatypes/flavors
(gagal denganUnknown command-line option '--tests'
). Dalam hal ini, perlu untuk menentukan tugas tes tertentu (misalnya,testProdReleaseUnitTest
bukan hanyatest
)sumber
./gradlew test --tests *testMyCollectionTake*
dan saya tidak tahu bagaimana saya harus menggantitest
dengan nama tes wildcardedDi bawah ini adalah perintah untuk menjalankan kelas uji tunggal menggunakan
gradlew
opsi baris perintah:Di bawah ini contoh untuk menjalankan kelas
com.example.TestClass
dengan varianVariant_1
:sumber
Anda harus mencoba menambahkan asterik (*) di bagian akhir.
sumber
Jalankan tes tunggal yang disebut MyTest:
sumber
Dalam kasus saya, peringatan kompiler java gerhana saya ditetapkan terlalu tinggi, dan gerhana tidak mengenali kelas saya sebagai valid untuk dieksekusi. Memperbarui pengaturan kompiler saya memperbaiki masalahnya. Anda dapat membaca lebih lanjut tentang hal ini di sini: anotasi-nonnull-tidak dapat diselesaikan
sumber