Strategi pengujian

Pengujian otomatis membantu Anda meningkatkan kualitas aplikasi dengan beberapa cara. Misalnya, API ini membantu Anda melakukan validasi, mendeteksi regresi, dan memverifikasi kompatibilitas. Strategi pengujian yang baik memungkinkan Anda memanfaatkan pengujian otomatis untuk berfokus pada manfaat penting: produktivitas developer.

Tim akan mencapai tingkat produktivitas yang lebih tinggi jika menggunakan pendekatan sistematis untuk pengujian yang dipadukan dengan peningkatan infrastruktur. Tindakan ini memberikan masukan yang tepat waktu tentang perilaku kode. Strategi pengujian yang baik akan menghasilkan hal-hal berikut:

  • Mendeteksi masalah sedini mungkin.
  • Dieksekusi dengan cepat.
  • Memberikan indikasi yang jelas saat ada yang perlu diperbaiki.

Halaman ini akan membantu Anda memutuskan jenis pengujian yang akan diterapkan, tempat menjalankannya, dan seberapa seringnya.

Piramida pengujian

Anda dapat mengategorikan pengujian dalam aplikasi modern berdasarkan ukuran. Pengujian kecil hanya berfokus pada sebagian kecil kode, sehingga mempercepat dan dapat diandalkan. Pengujian besar memiliki cakupan yang luas dan memerlukan penyiapan yang lebih kompleks yang sulit dikelola. Namun, pengujian besar memiliki lebih banyak fidelitas*, dan pengujian tersebut dapat menemukan lebih banyak masalah sekaligus.

*Fidelitas mengacu pada kemiripan lingkungan runtime pengujian dengan lingkungan produksi.

Distribusi jumlah pengujian menurut cakupan biasanya divisualisasikan dalam bentuk piramida.
Gambar 1. Distribusi jumlah pengujian menurut cakupan biasanya divisualisasikan dalam bentuk piramida.

Sebagian besar aplikasi harus memiliki banyak pengujian kecil dan relatif sedikit pengujian besar. Distribusi pengujian dalam setiap kategori harus membentuk piramida, dengan lebih banyak pengujian kecil yang membentuk dasar dan lebih sedikit pengujian besar yang membentuk ujung.

Meminimalkan biaya bug

Strategi pengujian yang baik akan memaksimalkan produktivitas developer sekaligus meminimalkan biaya untuk menemukan bug.

Pertimbangkan contoh strategi yang mungkin tidak efisien. Di sini, jumlah pengujian berdasarkan ukuran tidak disusun menjadi piramida. Ada terlalu banyak pengujian menyeluruh yang besar dan terlalu sedikit pengujian UI komponen:

Strategi dengan banyak pengujian di mana banyak pengujian dilakukan secara manual dan pengujian perangkat hanya dijalankan setiap malam.
Gambar 2. Strategi dengan banyak pengujian di mana banyak pengujian dilakukan secara manual dan pengujian perangkat hanya dijalankan setiap malam.

Artinya, terlalu sedikit pengujian yang dijalankan sebelum penggabungan. Jika ada bug, pengujian mungkin tidak mendeteksinya hingga pengujian menyeluruh harian atau mingguan dijalankan.

Penting untuk mempertimbangkan implikasinya terhadap biaya identifikasi dan perbaikan bug serta alasan pentingnya membiaskan upaya pengujian Anda ke pengujian yang lebih kecil dan lebih sering:

  • Jika terdeteksi oleh pengujian unit, bug biasanya diperbaiki dalam hitungan menit, sehingga biayanya rendah.
  • Pengujian menyeluruh dapat memerlukan waktu berhari-hari untuk menemukan bug yang sama. Hal ini dapat menarik beberapa anggota tim, sehingga mengurangi produktivitas secara keseluruhan dan berpotensi menunda rilis. Biaya bug ini lebih tinggi.

Meskipun demikian, strategi pengujian yang tidak efisien lebih baik daripada tidak ada strategi sama sekali. Jika bug sampai ke produksi, perbaikannya memerlukan waktu lama untuk diluncurkan di perangkat pengguna, terkadang berminggu-minggu, sehingga feedback loop-nya adalah yang terpanjang dan paling mahal.

Strategi pengujian yang skalabel

Piramida pengujian secara tradisional dibagi menjadi 3 kategori:

  • Pengujian unit
  • Pengujian integrasi
  • Pengujian menyeluruh.

Namun, konsep ini tidak memiliki definisi yang tepat, sehingga tim mungkin ingin menentukan kategorinya secara berbeda, misalnya menggunakan 5 lapisan:

Piramida pengujian 5 lapis dengan pengujian unit kategori, pengujian komponen, pengujian fitur, pengujian aplikasi, dan pengujian kandidat rilis, dalam urutan menaik.
Gambar 3. Piramida pengujian 5 lapis.
  • Pengujian unit dijalankan di mesin host dan memverifikasi satu unit logika fungsional tanpa dependensi pada framework Android.
    • Contoh: memverifikasi kesalahan off-by-one dalam fungsi matematika.
  • Pengujian komponen memverifikasi fungsi atau tampilan modul atau komponen secara independen dari komponen lain dalam sistem. Tidak seperti pengujian unit, area permukaan pengujian komponen meluas ke abstraksi yang lebih tinggi di atas setiap metode dan class.
  • Pengujian fitur memverifikasi interaksi dua komponen atau modul independen atau lebih. Pengujian fitur lebih besar dan lebih kompleks, dan biasanya beroperasi di tingkat fitur.
  • Pengujian aplikasi memverifikasi fungsi seluruh aplikasi dalam bentuk biner yang dapat di-deploy. Pengujian ini adalah pengujian integrasi besar yang menggunakan biner yang dapat di-debug, seperti build developer yang dapat berisi hook pengujian, sebagai sistem yang sedang diuji.
    • Contoh: Pengujian perilaku UI untuk memverifikasi perubahan konfigurasi dalam pengujian perangkat foldable, pelokalan, dan aksesibilitas
  • Pengujian kandidat rilis memverifikasi fungsi build rilis. Pengujian ini mirip dengan pengujian aplikasi, hanya saja biner aplikasi diminifikasi dan dioptimalkan. Pengujian ini adalah pengujian integrasi menyeluruh yang besar yang berjalan di lingkungan yang sedekat mungkin dengan produksi tanpa mengekspos aplikasi ke akun pengguna publik atau backend publik.

Kategorisasi ini memperhitungkan fidelitas, waktu, cakupan, dan tingkat isolasi. Anda dapat memiliki berbagai jenis pengujian di beberapa lapisan. Misalnya, lapisan pengujian Aplikasi dapat berisi pengujian perilaku, screenshot, dan performa.

Cakupan

Akses jaringan

Eksekusi

Jenis build

Lifecycle

Unit

Satu metode atau class dengan dependensi minimal.

Tidak

Lokal

Dapat di-debug

Pra-penggabungan

Komponen

Tingkat modul atau komponen

Beberapa kelas bersama-sama

Tidak

Lokal
Robolectric
Emulator

Dapat di-debug

Pra-penggabungan

Fitur

Tingkat fitur

Integrasi dengan komponen yang dimiliki oleh tim lain

Ditiru

Perangkat

Emulator Robolectric
Lokal

Dapat di-debug

Pra-penggabungan

Aplikasi

Tingkat aplikasi

Integrasi dengan fitur dan/atau layanan yang dimiliki oleh tim lain


Server staging
Server produksi tiruan

Emulator
Perangkat

Dapat di-debug

Pra-penggabungan
Pasca-penggabungan

Kandidat Rilis

Tingkat aplikasi

Integrasi dengan fitur dan/atau layanan yang dimiliki oleh tim lain

Server produksi

Emulator
Perangkat

Build rilis yang diminifikasi

Pasca-penggabungan
Pra-rilis

Menentukan kategori pengujian

Sebagai aturan praktis, Anda harus mempertimbangkan lapisan piramida terendah yang dapat memberikan tingkat masukan yang tepat kepada tim.

Misalnya, pertimbangkan cara menguji penerapan fitur ini: UI alur login. Bergantung pada hal yang perlu diuji, Anda akan memilih kategori yang berbeda:

Subjek yang sedang diuji

Deskripsi hal yang sedang diuji

Kategori pengujian

Contoh jenis pengujian

Logika validator formulir

Class yang memvalidasi alamat email berdasarkan ekspresi reguler dan memeriksa apakah kolom sandi dimasukkan. Tidak memiliki dependensi.

Pengujian unit

Pengujian unit JVM lokal

Perilaku UI formulir login

Formulir dengan tombol yang hanya diaktifkan jika formulir telah divalidasi

Pengujian komponen

Pengujian perilaku UI yang berjalan di Robolectric

Tampilan UI formulir login

Formulir yang mengikuti spesifikasi UX

Pengujian komponen

Pengujian Screenshot Pratinjau Compose

Integrasi dengan Pengelola Autentikasi

UI yang mengirim kredensial ke pengelola autentikasi dan menerima respons yang dapat berisi error yang berbeda.

Pengujian fitur

Pengujian JVM dengan palsu

Dialog login

Layar yang menampilkan formulir login saat tombol login ditekan.

Pengujian aplikasi

Pengujian perilaku UI yang berjalan di Robolectric

Perjalanan penting pengguna: Login

Alur login lengkap menggunakan akun pengujian terhadap server staging

Kandidat Rilis

Pengujian perilaku UI Compose menyeluruh yang berjalan di perangkat

Dalam beberapa kasus, apakah sesuatu termasuk dalam satu kategori atau kategori lainnya dapat bersifat subjektif. Mungkin ada alasan tambahan mengapa pengujian dipindahkan ke atas atau ke bawah, seperti biaya infrastruktur, ketidakstabilan, dan waktu pengujian yang lama.

Perhatikan bahwa kategori pengujian tidak menentukan jenis pengujian dan tidak semua fitur harus diuji di setiap kategori.

Pengujian manual juga dapat menjadi bagian dari strategi pengujian Anda. Biasanya, tim QA melakukan pengujian Calon Rilis, tetapi mereka juga dapat terlibat dalam tahap lain. Misalnya, pengujian eksplorasi untuk bug dalam fitur tanpa skrip.

Menguji infrastruktur

Strategi pengujian harus didukung oleh infrastruktur dan alat untuk membantu developer terus menjalankan pengujian dan menerapkan aturan yang menjamin bahwa semua pengujian lulus.

Anda dapat mengategorikan pengujian menurut cakupan untuk menentukan waktu dan tempat menjalankan pengujian. Misalnya, mengikuti model 5 lapisan:

Kategori

Lingkungan (tempat)

Pemicu (kapan)

Unit

[Local][4]

Setiap commit

Komponen

Lokal

Setiap commit

Fitur

Lokal dan emulator

Pra-penggabungan, sebelum menggabungkan atau mengirimkan perubahan

Aplikasi

Lokal, emulator, 1 ponsel, 1 perangkat foldable

Pasca-penggabungan, setelah menggabungkan atau mengirimkan perubahan

Kandidat Rilis

8 ponsel berbeda, 1 perangkat foldable, 1 tablet

Pra-rilis

  • Pengujian Unit dan Komponen dijalankan di sistem Continuous Integration untuk setiap commit baru, tetapi hanya untuk modul yang terpengaruh.
  • Semua pengujian Unit, Komponen, dan Fitur berjalan sebelum menggabungkan atau mengirim perubahan.
  • Pengujian aplikasi berjalan setelah penggabungan.
  • Pengujian Release Candidate dijalankan setiap malam di ponsel, perangkat foldable, dan tablet.
  • Sebelum rilis, pengujian Release Candidate dijalankan di sejumlah besar perangkat.

Aturan ini dapat berubah dari waktu ke waktu jika jumlah pengujian memengaruhi produktivitas. Misalnya, jika Anda memindahkan pengujian ke ritme harian, Anda dapat mengurangi waktu build dan pengujian CI, tetapi Anda juga dapat memperpanjang siklus masukan.