Cara menjalankan hanya satu kelas tes lokal di Gradle

430

Saya baru mengenal Gradle. Saya menggunakan Gradle 1.10 dan Ubuntu 13.

Saya ingin tahu apakah ada perintah untuk mengeksekusi hanya satu kelas uji lokal , mirip dengan 'testonly' di SBT.

bula
sumber
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.

Maleen Abewardana
sumber
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.

terlahir di udara
sumber
30
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 :b-module:test --tests "com.xyz.b.module.TestClass.testToRun"

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.

greperror
sumber
1
Atau sederhananya./gradlew :b-module:test --tests testToRun
Ahmed Ashour
32

Setelah banyak mencari tahu, yang berikut ini berhasil untuk saya:

gradle test --tests "a.b.c.MyTestFile.mySingleTest"

Pratik Khadloya
sumber
11
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)

anagaf
sumber
6
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:

gradlew.bat Connected**your bundleVariant**AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass

Di bawah ini contoh untuk menjalankan kelas com.example.TestClassdengan varian Variant_1:

gradlew.bat ConnectedVariant_1AndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.TestClass 
Naveenprasanth Duraisamy
sumber
2

Anda harus mencoba menambahkan asterik (*) di bagian akhir.

tes gradle --test "com.abc *"

mutkan
sumber
2

Jalankan tes tunggal yang disebut MyTest:

./gradlew app:testDebug --tests=com.example.MyTest
Kreker
sumber
0

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

Greg
sumber