Strategi pengujian

Pengujian otomatis membantu Anda meningkatkan kualitas aplikasi dalam berbagai cara. Misalnya, alat 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 mencapai tingkat produktivitas yang lebih tinggi saat mereka menggunakan pendekatan sistematis untuk pengujian yang dipasangkan dengan peningkatan infrastruktur. Dengan begitu, Anda akan mendapatkan masukan tepat waktu tentang perilaku kode. Strategi pengujian yang baik melakukan hal berikut:

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

Halaman ini akan membantu Anda memutuskan jenis pengujian yang akan diterapkan, tempat menjalankan pengujian, dan seberapa sering pengujian harus dijalankan.

Piramida pengujian

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

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

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

Sebagian besar aplikasi harus memiliki banyak pengujian kecil dan relatif sedikit pengujian besar. Distribusi pengujian di setiap kategori harus membentuk piramida, dengan pengujian kecil yang lebih banyak membentuk dasar dan pengujian besar yang lebih sedikit 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 menurut ukuran tidak disusun menjadi piramida. Terlalu banyak pengujian end-to-end yang besar dan terlalu sedikit pengujian UI komponen:

Strategi yang sangat mengandalkan pengujian manual dan pengujian perangkat hanya dijalankan setiap malam.
Gambar 2. Strategi yang sangat mengandalkan pengujian manual dan pengujian perangkat hanya dijalankan setiap malam.

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

Penting untuk mempertimbangkan implikasi yang ditimbulkan terhadap biaya identifikasi dan perbaikan bug serta alasan pentingnya memfokuskan upaya pengujian pada pengujian yang lebih kecil dan lebih sering:

  • Jika bug ditemukan oleh uji unit, biasanya bug tersebut dapat diperbaiki dalam beberapa 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.

Namun, strategi pengujian yang tidak efisien lebih baik daripada tidak ada strategi sama sekali. Jika bug sampai ke produksi, perbaikannya memerlukan waktu yang lama untuk sampai ke perangkat pengguna, terkadang berminggu-minggu, sehingga feedback loop menjadi yang paling lama dan paling mahal.

Strategi pengujian yang dapat diskalakan

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 mendefinisikan kategori mereka secara berbeda, misalnya menggunakan 5 lapisan:

Piramida pengujian 5 lapis dengan kategori pengujian unit, 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 error selisih satu dalam fungsi matematika.
  • Pengujian komponen memverifikasi fungsi atau tampilan modul atau komponen secara terpisah dari komponen lain dalam sistem. Tidak seperti pengujian unit, area permukaan pengujian komponen meluas ke abstraksi yang lebih tinggi di atas metode dan class individual.
  • Pengujian fitur memverifikasi interaksi dua atau lebih komponen atau modul independen. Pengujian fitur lebih besar dan lebih kompleks, serta 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 dev yang dapat berisi hook pengujian, sebagai sistem yang sedang diuji.
    • Contoh: Pengujian perilaku UI untuk memverifikasi perubahan konfigurasi di perangkat lipat, pengujian pelokalan, dan aksesibilitas
  • Pengujian kandidat rilis memverifikasi fungsi build rilis. Pengujian ini mirip dengan pengujian aplikasi, kecuali biner aplikasi diminifikasi dan dioptimalkan. Ini adalah pengujian integrasi end-to-end besar yang berjalan di lingkungan yang sedekat mungkin dengan produksi tanpa mengekspos aplikasi ke akun pengguna publik atau backend publik.

Pengkategorian ini mempertimbangkan 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

Satuan

Metode atau class tunggal 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

Mocked

Lokal
Robolectric
Emulator
Devices

Dapat di-debug

Pra-penggabungan

Aplikasi

Tingkat aplikasi

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

Mocked
Staging server
Prod server

Perangkat
Emulator

Dapat di-debug

Sebelum penggabungan
Setelah penggabungan

Kandidat Rilis

Tingkat aplikasi

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

Server produksi

Perangkat
Emulator

Build rilis yang di-minify

Pasca-penggabungan
Pra-rilis

Menentukan kategori pengujian

Sebagai aturan praktis, Anda harus mempertimbangkan lapisan terendah piramida 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 diuji

Deskripsi tentang apa yang sedang diuji

Kategori pengujian

Contoh jenis pengujian

Logika validator formulir

Class yang memvalidasi alamat email berdasarkan ekspresi reguler dan memeriksa apakah kolom sandi telah diisi. 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 mengirimkan kredensial ke pengelola autentikasi dan menerima respons yang dapat berisi berbagai error.

Pengujian fitur

Pengujian JVM dengan tiruan

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 penyiapan

Kandidat Rilis

Pengujian perilaku UI Compose menyeluruh yang berjalan di perangkat

Dalam beberapa kasus, apakah sesuatu termasuk dalam satu kategori atau kategori lain dapat bersifat subjektif. Ada alasan lain 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 Kandidat Rilis, tetapi mereka juga dapat terlibat dalam tahap lainnya. Misalnya, pengujian eksploratif untuk bug dalam fitur tanpa skrip.

Infrastruktur pengujian

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

Anda dapat mengategorikan pengujian menurut cakupan untuk menentukan kapan dan di mana pengujian mana yang akan dijalankan. Misalnya, mengikuti model 5 lapisan:

Kategori

Lingkungan (di mana)

Pemicu (kapan)

Satuan

[Lokal][4]

Setiap commit

Komponen

Lokal

Setiap commit

Fitur

Lokal dan emulator

Sebelum penggabungan, sebelum menggabungkan atau mengirimkan perubahan

Aplikasi

Lokal, emulator, 1 ponsel, 1 perangkat foldable

Setelah 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 dijalankan sebelum menggabungkan atau mengirimkan perubahan.
  • Pengujian Aplikasi dijalankan setelah penggabungan.
  • Pengujian Release Candidate dijalankan setiap malam di ponsel, perangkat foldable, dan tablet.
  • Sebelum rilis, pengujian Kandidat Rilis dijalankan di sejumlah besar perangkat.

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