Espresso mengklaim bahwa tidak perlu Thread.sleep();
, tetapi kode saya tidak berfungsi kecuali saya menyertakannya. Saya terhubung ke IP. Saat menghubungkan, dialog kemajuan ditampilkan. Saya perlu sleep
menunggu dialog ditutup. Ini adalah cuplikan pengujian saya di mana saya menggunakannya:
IP.enterIP(); // fills out an IP dialog (this is done with espresso)
//progress dialog is now shown
Thread.sleep(1500);
onView(withId(R.id.button).perform(click());
Saya telah mencoba kode ini dengan dan tanpa yang Thread.sleep();
tetapi mengatakan R.id.Button
tidak ada. Satu-satunya cara agar saya berhasil adalah dengan tidur.
Juga, saya telah mencoba mengganti Thread.sleep();
dengan hal-hal seperti getInstrumentation().waitForIdleSync();
dan masih belum berhasil.
Apakah ini satu-satunya cara untuk melakukan ini? Atau apakah saya melewatkan sesuatu?
Terima kasih sebelumnya.
android
testing
android-espresso
Chad Bingham
sumber
sumber
Jawaban:
Menurut pendapat saya, pendekatan yang benar adalah:
Dan kemudian pola penggunaannya adalah:
sumber
Terima kasih kepada AlexK atas jawabannya yang luar biasa. Ada kasus di mana Anda perlu membuat penundaan dalam kode. Ini tidak selalu menunggu respons server tetapi mungkin menunggu animasi selesai. Saya pribadi memiliki masalah dengan Espresso idolingResources (saya pikir kami menulis banyak baris kode untuk hal yang sederhana) jadi saya mengubah cara AlexK melakukan menjadi kode berikut:
Jadi Anda dapat membuat
Delay
kelas dan memasukkan metode ini ke dalamnya untuk mengaksesnya dengan mudah. Anda dapat menggunakannya di kelas Tes Anda dengan cara yang sama:onView(isRoot()).perform(waitFor(5000));
sumber
Thread.sleep()
Saya menemukan utas ini ketika mencari jawaban untuk masalah serupa di mana saya sedang menunggu respons server dan mengubah visibilitas elemen berdasarkan respons.
Sementara solusi di atas benar-benar membantu, saya akhirnya menemukan contoh yang sangat baik ini dari chiuki dan sekarang menggunakan pendekatan itu sebagai tujuan saya setiap kali saya menunggu tindakan terjadi selama periode idle aplikasi.
Saya telah menambahkan ElapsedTimeIdlingResource () ke kelas utilitas saya sendiri, sekarang dapat secara efektif menggunakannya sebagai alternatif yang sesuai untuk Espresso, dan sekarang penggunaannya bagus dan bersih:
sumber
I/TestRunner: java.lang.NoClassDefFoundError: fr.x.app.y.testtools.ElapsedTimeIdlingResource
kesalahan. Ada ide. Saya menggunakan Proguard tetapi dengan menonaktifkan obfuscation.-keep
pernyataan untuk kelas yang tidak ditemukan untuk memastikan bahwa ProGuard tidak menghapusnya karena tidak perlu. Info lebih lanjut di sini: developer.android.com/tools/help/proguard.html#keep-codeSaya pikir lebih mudah menambahkan baris ini:
Menunggu sejumlah milidetik (dari uptimeMillis) sebelum kembali. Mirip dengan sleep (long), tetapi tidak membuang InterruptedException; peristiwa interrupt () ditunda hingga operasi interupsi berikutnya. Tidak kembali hingga setidaknya jumlah milidetik yang ditentukan telah berlalu.
sumber
Anda bisa menggunakan metode Barista:
BaristaSleepActions.sleep(2000);
BaristaSleepActions.sleep(2, SECONDS);
Barista adalah pustaka yang membungkus Espresso untuk menghindari penambahan semua kode yang dibutuhkan oleh jawaban yang diterima. Dan ini tautannya! https://github.com/SchibstedSpain/Barista
sumber
Thread.sleep()
. Maaf! Itu ada di beberapa video pertama yang dibuat Google tentang Espresso tapi saya tidak ingat yang mana ... beberapa tahun yang lalu. Maaf! : ·) Oh! Sunting! Saya memasang tautan ke video di PR yang saya buka tiga tahun lalu. Saksikan berikut ini! github.com/AdevintaSpain/Barista/pull/19Ini mirip dengan jawaban ini tetapi menggunakan batas waktu sebagai ganti upaya dan dapat dihubungkan dengan ViewInteractions lainnya:
Pemakaian:
sumber
Saya baru mengenal coding dan Espresso, jadi meskipun saya tahu solusi yang baik dan masuk akal adalah menggunakan idling, saya belum cukup cerdas untuk melakukan itu.
Sampai saya menjadi lebih berpengetahuan, saya masih membutuhkan tes saya untuk berjalan, jadi untuk saat ini saya menggunakan solusi kotor ini yang membuat sejumlah upaya untuk menemukan elemen, berhenti jika menemukannya dan jika tidak, sebentar tidur dan mulai lagi hingga mencapai jumlah percobaan maksimum (jumlah percobaan tertinggi sejauh ini sekitar 150).
Saya menggunakan ini di semua metode yang menemukan elemen berdasarkan ID, teks, induk dll:
sumber
findById(int itemId)
metode ini akan mengembalikan elemen (yang bisa jadi NULL) apakahwaitForElementUntilDisplayed(element);
mengembalikan benar atau salah .... jadi, itu tidak baikIdlingResource
Ini tidak cukup bagi saya karena perincian tingkat polling 5 detik (terlalu besar untuk kasus penggunaan saya). Jawaban yang diterima juga tidak berfungsi untuk saya (penjelasan mengapa sudah termasuk dalam umpan komentar panjang jawaban itu). Terima kasih untuk ini! Saya mengambil ide Anda dan membuat solusi saya sendiri dan itu bekerja seperti pesona.Espresso dibuat untuk menghindari panggilan sleep () dalam pengujian. Pengujian Anda seharusnya tidak membuka dialog untuk memasukkan IP, yang seharusnya menjadi tanggung jawab aktivitas yang diuji.
Di sisi lain, pengujian UI Anda harus:
Tesnya akan terlihat seperti ini:
Espresso menunggu semua yang terjadi di UI thread dan kumpulan AsyncTask selesai sebelum menjalankan pengujian Anda.
Ingatlah bahwa pengujian Anda tidak boleh melakukan apa pun yang merupakan kemampuan aplikasi Anda. Ini harus berperilaku seperti "pengguna yang terinformasi dengan baik": pengguna yang mengklik, memverifikasi bahwa ada sesuatu yang ditampilkan di layar, tetapi, pada kenyataannya, mengetahui ID dari komponen
sumber
Anda harus menggunakan Espresso Idling Resource, yang disarankan di CodeLab ini
Contoh panggilan Asynchronous dari Presenter
Dependensi
Untuk androidx
Repo Resmi: https://github.com/googlecodelabs/android-testing
Contoh IdlingResource: https://github.com/googlesamples/android-testing/tree/master/ui/espresso/IdlingResourceSample
sumber
Meskipun menurut saya yang terbaik adalah menggunakan Idling Resources untuk ini ( https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/ ) Anda mungkin dapat menggunakan ini sebagai fallback:
dan kemudian menyebutnya dalam kode Anda sebagai contoh:
dari pada
Ini juga memungkinkan Anda menambahkan waktu tunggu untuk tindakan tampilan dan pernyataan tampilan.
sumber
return new TimedViewInteraction(Espresso.onView(viewMatcher));
denganreturn new TimedViewInteraction(Espresso.onView(viewMatcher).check(matches(isDisplayed())));
Utilitas saya mengulangi eksekusi runnable atau callable hingga lolos tanpa kesalahan atau melempar setelah batas waktu. Ini bekerja dengan sempurna untuk tes Espresso!
Misalkan interaksi tampilan terakhir (klik tombol) mengaktifkan beberapa utas latar belakang (jaringan, database, dll.). Hasilnya, layar baru akan muncul dan kami ingin memeriksanya di langkah berikutnya, tetapi kami tidak tahu kapan layar baru akan siap untuk diuji.
Pendekatan yang direkomendasikan adalah memaksa aplikasi Anda mengirim pesan tentang status thread ke pengujian Anda. Terkadang kita dapat menggunakan mekanisme bawaan seperti OkHttp3IdlingResource. Dalam kasus lain, Anda harus menyisipkan potongan kode di berbagai tempat sumber aplikasi Anda (Anda harus mengetahui logika aplikasi!) Untuk menguji dukungan saja. Selain itu, kami harus mematikan semua animasi Anda (meskipun itu bagian dari UI).
Pendekatan lainnya sedang menunggu, misalnya SystemClock.sleep (10000). Tetapi kami tidak tahu berapa lama harus menunggu dan bahkan penundaan yang lama tidak dapat menjamin kesuksesan. Di sisi lain, tes Anda akan bertahan lama.
Pendekatan saya adalah menambahkan kondisi waktu untuk melihat interaksi. Misalnya kami menguji bahwa layar baru akan muncul selama 10000 mc (batas waktu). Tetapi kami tidak menunggu dan memeriksanya secepat yang kami inginkan (mis. Setiap 100 md) Tentu saja, kami memblokir utas pengujian seperti itu, tetapi biasanya, itu hanya yang kami butuhkan dalam kasus seperti itu.
Ini adalah sumber kelas saya:
https://gist.github.com/alexshr/ca90212e49e74eb201fbc976255b47e0
sumber
Ini adalah helper yang saya gunakan di Kotlin untuk Pengujian Android. Dalam kasus saya, saya menggunakan longOperation untuk meniru respons server tetapi Anda dapat menyesuaikannya untuk tujuan Anda.
sumber
Saya akan menambahkan cara saya melakukan ini ke dalam campuran:
Disebut seperti ini:
Anda dapat menambahkan parameter seperti iterasi maks, panjang iterasi, dll ke fungsi suspendUntilSuccess.
Saya masih lebih suka menggunakan sumber daya yang tidak aktif, tetapi ketika pengujian dilakukan karena animasi yang lambat pada perangkat misalnya, saya menggunakan fungsi ini dan berfungsi dengan baik. Ini tentu saja dapat bertahan hingga 5 detik seperti sebelum gagal, sehingga dapat meningkatkan waktu eksekusi pengujian Anda jika tindakan untuk berhasil tidak pernah berhasil.
sumber