Petunjuk

Alternatif untuk Resource Nonaktif dalam pengujian Compose: API waitUntil (diperbarui)

Waktu baca: 3 menit
Jose Alcérreca
Developer Relations Engineer

Dalam artikel ini, Anda akan mempelajari cara menggunakan API pengujian waitUntil di Compose untuk menunggu hingga kondisi tertentu terpenuhi. Ini adalah alternatif yang baik untuk menggunakan Idling Resources dalam beberapa situasi.

[Pembaruan 2023] Singkatnya: gunakan API waitUntil baru untuk menyinkronkan dalam pengujian Compose (v1.4.0+).


Apa itu sinkronisasi?

Salah satu cara untuk mengategorikan pengujian adalah berdasarkan cakupannya. Pengujian kecil, atau pengujian unit, berfokus pada bagian kecil aplikasi Anda, sedangkan pengujian besar, atau menyeluruh, mencakup sebagian besar aplikasi Anda. Anda dapat membaca tentang hal ini dan jenis pengujian lainnya dalam dokumentasi pengujian yang baru diperbarui.

Tekan enter atau klik untuk melihat gambar dalam ukuran penuh

large_0_9n_Nqkt_HHUTOQ_In_AI_b113b43bcf.png
Cakupan pengujian yang berbeda dalam aplikasi

Sinkronisasi adalah mekanisme yang memungkinkan pengujian mengetahui kapan harus menjalankan operasi berikutnya. Semakin besar potongan kode yang Anda pilih untuk diverifikasi, semakin sulit untuk disinkronkan dengan pengujian. Dalam pengujian unit, Anda dapat dengan mudah memiliki kontrol penuh atas eksekusi kode yang akan diverifikasi. Namun, saat kita memperluas cakupan untuk menyertakan lebih banyak class, modul, dan lapisan, framework pengujian akan kesulitan mengetahui apakah aplikasi sedang dalam operasi atau tidak.

Tekan enter atau klik untuk melihat gambar dalam ukuran penuh

large_correct_b1a355f41b.webp
Sinkronisasi yang benar antara pengujian dan aplikasi

androidx.test dan, secara tidak langsung, Compose Test, menggunakan beberapa trik di balik layar sehingga Anda tidak perlu terlalu mengkhawatirkan hal ini. Misalnya, jika thread utama sedang sibuk, pengujian akan dijeda hingga dapat menjalankan baris berikutnya.

Namun, mereka tidak dapat mengetahui segalanya. Misalnya, jika Anda memuat data di thread latar belakang, framework pengujian mungkin menjalankan operasi berikutnya terlalu cepat, sehingga membuat pengujian Anda gagal. Situasi terburuk adalah ketika hal ini hanya terjadi pada sebagian kecil waktu, sehingga membuat pengujian menjadi tidak stabil.

Opsi 1: Sumber Daya dalam Keadaan Diam

Resource Nonaktif adalah fitur Espresso yang memungkinkan Anda, sebagai developer, memutuskan kapan aplikasi sedang sibuk. Anda memiliki dua cara untuk menggunakannya:

1. Menginstalnya di framework atau library yang melakukan pekerjaan yang tidak dapat dilihat oleh pengujian.

Contoh yang baik untuk hal ini adalah RxIdler, yang membungkus scheduler RxJava. Ini adalah cara yang lebih disukai untuk mendaftarkan Resource Nonaktif karena memungkinkan Anda memisahkan penyiapan pengujian dari kode pengujian dengan rapi.

2. Memodifikasi kode yang sedang diuji untuk secara eksplisit mengekspos informasi tentang apakah aplikasi Anda sedang sibuk atau tidak.

Misalnya, Anda dapat mengubah repositori (atau test double) untuk menunjukkan bahwa repositori sedang sibuk saat memuat data dari sumber data:

Hal ini tidak ideal karena Anda mencemari kode produksi, atau membuat pengganda pengujian yang rumit, dan ada beberapa situasi saat sulit untuk menginstalnya. Misalnya, bagaimana cara menggunakan Idling Resources di Kotlin Flow? Pembaruan mana yang terakhir?

Sebagai gantinya, kita dapat menunggu sesuatu.

Opsi 2: Menunggu sesuatu… dengan cara yang salah

Memuat data biasanya cepat, terutama saat menggunakan data palsu, jadi mengapa membuang waktu dengan resource yang tidak digunakan saat Anda dapat membuat pengujian tidur selama beberapa detik?

Pengujian ini akan berjalan lebih lambat dari yang diperlukan atau gagal. Jika memiliki ratusan atau ribuan pengujian UI, Anda ingin pengujian berjalan secepat mungkin.

Selain itu, terkadang emulator atau perangkat berperilaku tidak semestinya dan jank, sehingga operasi tersebut memerlukan waktu sedikit lebih lama dari 2000 md, yang merusak build Anda. Jika Anda memiliki ratusan pengujian, hal ini akan menjadi masalah besar.

0_DOCdjq-JpPDGV5OB.png

Opsi 3: Menunggu dengan cara yang benar!

Jika Anda tidak ingin mengubah kode yang sedang diuji untuk mengetahui kapan kode tersebut sibuk, opsi lain adalah menunggu hingga kondisi tertentu terpenuhi, bukan menunggu selama jangka waktu yang tidak ditentukan.

1_jIYFxE4qlHXMi2SwW6JemA.png

Di Compose, Anda dapat memanfaatkan fungsi waitUntil, yang menggunakan fungsi lain yang menghasilkan boolean.

Info terbaru 22/03/2023: mulai dari Compose 1.4.0, kami menambahkan serangkaian API waitUntil baru:

[Sebelum 1.4.0: Gunakan helper ini: waitUntilExists, waitUntilNodeCount]

…dan gunakan seperti ini:

Gunakan API ini hanya saat Anda perlu menyinkronkan pengujian dengan UI. Menyinkronkan setiap pernyataan pengujian akan mencemari kode pengujian secara tidak perlu, sehingga lebih sulit untuk dipertahankan.

Lalu, kapan Anda harus menggunakannya? Kasus penggunaan yang baik untuknya adalah memuat data dari yang dapat diamati (dengan LiveData, Kotlin Flow, atau RxJava). Jika UI Anda perlu menerima beberapa update sebelum Anda menganggapnya tidak aktif, Anda mungkin ingin menyederhanakan sinkronisasi menggunakan waitUntil.

Misalnya, saat Anda mengumpulkan Flow dari tampilan:

Dan Anda memancarkan beberapa item ke dalamnya:

Jika repository memerlukan waktu yang tidak ditentukan untuk menampilkan hasil pertama, framework pengujian akan menganggap “Memuat” sebagai status tidak ada aktivitas (nilai awal yang ditetapkan di collectAsState) dan melanjutkan dengan pernyataan berikutnya.

Jadi, Anda dapat membuat pengujian jauh lebih andal jika memastikan UI tidak menampilkan indikator pemuatan:


Selamat… tunggu… pengujian!


Lisensi cuplikan kode:

  Copyright 2022 Google LLC.
SPDX-License-Identifier: Apache-2.0
Ditulis oleh:

Lanjutkan membaca