Satu fungsi konversi nilai biasanya punya lusinan kasus batas: 90 tepat, 89, 70, 69, nilai kosong, nilai negatif. Menulis satu metode test per kasus menghasilkan berkas uji yang panjang dan rawan copy-paste. Parameterized test menulis logika verifikasi sekali, lalu menjalankannya untuk setiap kombinasi masukan. Chapter ini membahas properties (TestParameter) di matlab.unittest beserta padanan manualnya:
- Definisi parameter lewat
properties (TestParameter). - Kombinasi parameter (produk kartesian vs sekuensial).
- Menjalankan subset test dengan penyaring parameter.
- Padanan manual portabel: tabel kasus + loop + assert berlabel.
Masalah Duplikasi Test #
Tanpa parameterisasi, tiga kasus fungsi nilaiHuruf() menjadi tiga metode yang isinya hampir identik — hanya angka masukan dan huruf harapan yang berbeda. Aturan praktisnya: jika isi test berbeda hanya pada data, data itu layak menjadi parameter; jika test memerlukan logika verifikasi yang berbeda, test tetap harus dipisah.
Mekanisme di balik layar: framework membangkitkan test element untuk setiap kombinasi nilai parameter pada saat suite dibuat. Setiap elemen diberi nama seperti NamaKelas/testMetode(nilai=kecil), sehingga hasil laporan mencantumkan kombinasi mana yang gagal — informasi yang hilang bila lima assert ditumpuk dalam satu metode test.
Parameterized Test di matlab.unittest (MATLAB-ONLY) #
Verifikasi ke dokumentasi resmi R2026b: parameter dideklarasikan di properties (TestParameter), metode test menerima properti tersebut sebagai argumen tambahan, dan blok methods (Test) mendapat atribut ParameterCombination bila perlu:
% Berkas: TestNilaiHuruf.m (MATLAB-ONLY, butuh matlab.unittest)
classdef TestNilaiHuruf < matlab.unittest.TestCase
properties (TestParameter)
kasus = struct( ...
'tinggi', struct('nilai', 95, 'harapan', 'A'), ...
'batasA', struct('nilai', 90, 'harapan', 'A'), ...
'batasB', struct('nilai', 89, 'harapan', 'B'), ...
'rendah', struct('nilai', 55, 'harapan', 'D'));
end
methods (Test)
function testHuruf(testCase, kasus)
testCase.verifyEqual(nilaiHuruf(kasus.nilai), kasus.harapan)
end
end
endEmpat elemen suite dibangkitkan — satu per label — dengan nama seperti TestNilaiHuruf/testHuruf(kasus=batasA). Nilai struct bersarang (kasus.nilai, kasus.harapan) menjaga pasangan masukan-harapan tetap satu kesatuan, padanan satu baris tabel kasus pada versi manual.
Dua bentuk sumber nilai yang didukung blok TestParameter:
| Bentuk definisi | Contoh | Nama elemen |
|---|---|---|
| cell array | type = {'single','double','uint16'} | type=value1, type=value2, … |
| struct berlabel | level = struct('kecil',2, 'sedang',4) | level=kecil, level=sedang |
Pilih label yang bermakna pada struct berlabel: nama elemen level=kecil jauh lebih terbaca di laporan kegagalan daripada level=value1, dan label inilah yang dipakai saat menyaring subset test.
Kombinasi beberapa parameter mengikuti aturan berikut:
Atribut pada blok Test | Perilaku | Jumlah elemen (3 × 2 nilai) |
|---|---|---|
default ('exhaustive') | produk kartesian semua kombinasi | 6 |
ParameterCombination = 'sequential' | pasangan searah per indeks | 2 |
Contoh resmi dari dokumentasi: class TestCarpet dengan properti type (3 nilai) dan level (3 nilai) menghasilkan 9 elemen untuk testClass(type,level), sedangkan testNumel(level,side) dengan ParameterCombination='sequential' hanya menghasilkan 3 elemen berpasangan level=small,side=small dan seterusnya.
Menjalankan subset parameter memakai name-value pada runtests atau pemilih HasParameter:
% Jalankan hanya parameter bernama 'batasA' (MATLAB-ONLY)
results = runtests("TestNilaiHuruf", ParameterName = "batasA");
% Alternatif: pilih saat suite dibuat
import matlab.unittest.selectors.HasParameter
suite = matlab.unittest.TestSuite.fromFile("TestNilaiHuruf.m", ...
HasParameter("Name", "batasA"));Versi Portable: Tabel Kasus + Loop #
Padanan manual menyimpan kasus sebagai tabel (cell array) lalu menjalankan assert yang sama di dalam loop. Potongan utama dari uji_parametrik.m di bawah halaman ini:
% --- SATU PARAMETER: tabel kasus {label, masukan, harapan} ---
kasus = {
'nilai sempurna ', 95, 'A';
'batas bawah A ', 90, 'A';
'batas atas B ', 89, 'B';
'nilai tengah B ', 80, 'B';
'batas bawah B ', 70, 'B';
'nilai di bawah ', 55, 'D'
};
jumlahLolos = 0;
for k = 1:size(kasus, 1)
label = kasus{k, 1};
masukan = kasus{k, 2};
harapan = kasus{k, 3};
hasil = nilaiHuruf(masukan);
assert(strcmp(hasil, harapan), ...
'kasus %d (%s): masukan %d, harapan %s, hasil %s', ...
k, strtrim(label), masukan, harapan, hasil);
fprintf('PASS %s nilai=%d -> %s\n', label, masukan, hasil);
jumlahLolos = jumlahLolos + 1;
endOutput yang Dihasilkan (dari uji_parametrik.m lengkap, bagian satu parameter):
== Parameterized: nilaiHuruf (1 parameter, 6 kasus) ==
PASS nilai sempurna nilai=95 -> A
PASS batas bawah A nilai=90 -> A
PASS batas atas B nilai=89 -> B
PASS nilai tengah B nilai=80 -> B
PASS batas bawah B nilai=70 -> B
PASS nilai di bawah nilai=55 -> D
Ringkasan: 6/6 kasus lolos
== Parameterized: hargaDiskon (2 parameter, 3 x 2 = 6 kombinasi) ==
PASS harga=100000 persen=10% -> 90000
PASS harga=100000 persen=25% -> 75000
PASS harga=250000 persen=10% -> 225000
PASS harga=250000 persen=25% -> 187500
PASS harga=500000 persen=10% -> 450000
PASS harga=500000 persen=25% -> 375000
Ringkasan: 6/6 kombinasi lolosMari kita bedah baris-baris kode di atas:
- Baris 2-9 (
kasus = { ... }): setiap baris adalah satu kasus uji — label penjelas, masukan, dan hasil harapan; label ikut tercetak saat gagal sehingga kegagalan mudah dilacak. - Baris 16 (
hasil = nilaiHuruf(masukan)): fungsi yang diuji dipanggil dengan masukan dari tabel — satu-satunya baris yang berubah bila kasus ditambah. - Baris 17-19 (
assert(strcmp(...), ...)): assert membandingkan hasil dengan harapan; pesan galat memuat nomor kasus, label, masukan, harapan, dan hasil aktual — padanan nama elementestMetode(nilai=kecil)versimatlab.unittest. - Bagian kedua (loop bersarang
hargaDiskon): dua parameter diiterasi dengan loop bersarang sehingga 3 harga × 2 persen menghasilkan 6 kombinasi — padanan manual produk kartesianParameterCombinationdefault.
Kapan Memakai Parameterized Test #
Gunakan parameterized test ketika sekumpulan kasus memverifikasi perilaku yang sama dengan data berbeda: konversi satuan, fungsi matematika, parser format, atau validasi batas. Hindari ketika tiap kasus butuh alur verifikasi berbeda — memaksakan semuanya ke satu tabel berujung pada kolom “pengecualian” yang makin sulit dibaca. Aturan sederhana: jika kolom tabel harus berisi flag untuk menyalakan logika khusus, pisahkan menjadi tabel (atau test) tersendiri.
Ringkasan #
properties (TestParameter) mendeklarasikan sumber parameter (cell array atau struct berlabel), metode Test menerimanya sebagai argumen tambahan, dan framework membangkitkan satu elemen per kombinasi — produk kartesian secara default, atau pasangan searah dengan ParameterCombination='sequential'. Penyaring ParameterName/HasParameter menjalankan subset kombinasi. Padanan manual — cell array kasus + loop + assert berlabel — memberikan jejak kegagalan yang sama dan teruji penuh di uji_parametrik.m.