Pengujian Berpasangan

Bagaimana pengujian berpasangan mengurangi kombinasi parameter dan menghemat upaya sambil mempertahankan cakupan yang berguna.

Diperbarui:

Daftar isi

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.

plain text
ID	Browser	Locale	Peran
PW1	Chrome	ru	viewer
PW2	Chrome	en	editor
PW3	Firefox	ru	editor
PW4	Firefox	en	viewer

Audit cakupannya daripada memercayai jumlah baris

plain text
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	PW2

Setiap 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.

plain text
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

Rencanakan pemeriksaan lintas browser

NIST: pengujian kombinatorial dan cakupan interaksi