Banyaknya parameter dan nilai membuat pengujian kombinasi menyeluruh menjadi mahal. Pengujian berpasangan mengurangi jumlah pengujian sekaligus mencakup setiap pasangan nilai parameter. Ini sering kali menyeimbangkan biaya pengujian dengan kemungkinan menemukan cacat.
Mengapa berpasangan membantu
Banyak cacat yang muncul akibat interaksi antara dua faktor, bukan kombinasi lima atau enam faktor yang jarang terjadi. Oleh karena itu, mencakupi setiap pasangan dapat menemukan sebagian besar masalah dengan pengujian yang jauh lebih sedikit.
Di mana menerapkannya
- →Formulir dengan beberapa bidang dan nilai independen.
- →Kombinasi perangkat, browser, peran, paket, negara, dan bahasa.
- →API dengan banyak parameter dan mode pemanggilan.
- →Matriks kompatibilitas dimana pengujian menyeluruh terlalu mahal.
Apa yang perlu diingat
- →Pairwise tidak menggantikan pengujian risiko bisnis yang penting atau kombinasi berbahaya yang diketahui.
- →Parameter dependen tidak boleh dicampuradukkan secara membabi buta sebagai parameter independen.
- →Kecualikan terlebih dahulu kombinasi yang secara logis tidak mungkin dilakukan.
- →Tambahkan skenario penting di samping kumpulan berpasangan yang dihasilkan.
Panduan praktis
Gunakan secara berpasangan untuk mengoptimalkan cakupan, bukan membenarkan rangkaian sekecil mungkin. Identifikasi kasus-kasus berisiko tinggi secara manual, tambahkan secara berpasangan untuk cakupannya, lalu perkuat cakupan dengan skenario negatif dan skenario batas.
Berpasangan membantu ketika kombinasi parameter adalah masalah sebenarnya. Ini bukan solusi universal untuk barisan, keadaan, atau perhitungan yang kompleks.
Contoh lengkap: empat tes yang mencakup seluruh dua belas pasang
Model fiktif ini memiliki tiga faktor: browser (Chrome atau Firefox), locale antarmuka (ru atau en), dan peran akun (viewer atau editor). Kedelapan kombinasi diizinkan. Versi browser, sistem operasi, dataset, dan feature flag dibuat tetap selama latihan ini; catat nilai persisnya saat menjalankan pengujian browser nyata. Ini adalah model pemilihan masukan, bukan aplikasi web yang dapat dijalankan.
Cakupan kombinasi penuh memerlukan baris 2 × 2 × 2 = 8. Pairwise menanyakan setiap pasangan nilai dari dua faktor berbeda: empat pasangan browser–lokal, empat pasangan peran browser, dan empat pasangan peran lokal. Empat baris berikutnya mencakup dua belas pasang tersebut.
ID Browser Locale Peran
PW1 Chrome ru viewer
PW2 Chrome en editor
PW3 Firefox ru editor
PW4 Firefox en viewerAudit cakupannya daripada memercayai jumlah baris
Faktor A Faktor B Dicakup oleh
Browser=Chrome Locale=ru PW1
Browser=Chrome Locale=en PW2
Browser=Firefox Locale=ru PW3
Browser=Firefox Locale=en PW4
Browser=Chrome Peran=viewer PW1
Browser=Chrome Peran=editor PW2
Browser=Firefox Peran=viewer PW4
Browser=Firefox Peran=editor PW3
Locale=ru Peran=viewer PW1
Locale=ru Peran=editor PW3
Locale=en Peran=viewer PW4
Locale=en Peran=editor PW2Setiap baris tabel memberi nama pasangan yang diperlukan dan tes yang memuatnya. Tabel ini mencakup setiap pasangan satu kali. Empat pengujian minimal untuk model biner tanpa batasan ini: empat pasangan browser-lokal saja memerlukan setidaknya empat baris. Kesimpulan tersebut hanya berlaku untuk model spesifik ini, bukan untuk rangkaian berpasangan sembarang.
Verifikasi matriks dengan Python 3
Salin kode ini ke pairwise_coverage.py dan jalankan python3 pairwise_coverage.py. Kode hanya menggunakan pustaka standar dan tidak mengirim permintaan jaringan. Keluaran yang diharapkan: Pairs: 12/12; triples: 4/8.
from itertools import product, combinations
levels = [("Chrome", "Firefox"), ("ru", "en"), ("viewer", "editor")]
rows = [
("Chrome", "ru", "viewer"),
("Chrome", "en", "editor"),
("Firefox", "ru", "editor"),
("Firefox", "en", "viewer"),
]
required = {(i, a, j, b) for i, j in combinations(range(3), 2)
for a, b in product(levels[i], levels[j])}
covered = {(i, row[i], j, row[j]) for row in rows
for i, j in combinations(range(3), 2)}
assert all(row in set(product(*levels)) for row in rows)
assert covered == required
assert ("Chrome", "en", "viewer") not in rows
print(f"Pairs: {len(covered)}/{len(required)}; triples: {len(set(rows))}/8")Tetapkan acuan hasil yang diharapkan untuk setiap konfigurasi
Untuk fitur dokumen fiktif, tentukan aturan sebelum eksekusi: viewer dapat membaca tetapi upaya pengeditan membuat konten yang disimpan tidak berubah; editor dapat menyimpan hasil edit yang valid tepat satu kali. Di setiap baris matriks, periksa lokal yang dipilih, hasil spesifik peran, dan data yang disimpan. Cakupan berpasangan saja tidak dapat menentukan hasil tersebut; konfigurasi yang lulus bukanlah bukti tanpa pernyataan.
Cacat yang dipicu hanya oleh Chrome + en + viewer terlewatkan oleh matriks ini: tripel tersebut tidak ada meskipun semua pasangannya muncul di tempat lain. Tambahkan kombinasi tersebut ketika risiko atau cacat sebelumnya membenarkannya. Urutan, batasan, izin, dan pemeriksaan kinerja masih memerlukan desain terpisah. Tidak ada persentase cacat yang ditemukan yang berasal dari “pasangan 12/12”.
Jika batasan produk membuat kombinasi menjadi tidak mungkin, buatlah kombinasi penuh yang diizinkan terlebih dahulu, turunkan pasangan yang dapat dicapai dalam kombinasi tersebut, lalu buat ulang dan periksa kembali rangkaian tereduksi. Menghapus baris yang tidak valid saja dapat menghapus pasangan valid lainnya. Latihan: hapus PW4; pasangan yang tidak tertutup menjadi Firefox–en, Firefox–viewer dan en–viewer. Kembalikan baris penutup yang valid daripada menurunkan penyebut secara diam-diam.
Lanjutkan belajar
Pilih kasus tambahan berdasarkan risiko