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:

matlab
% 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
end

Empat 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 definisiContohNama elemen
cell arraytype = {'single','double','uint16'}type=value1, type=value2, …
struct berlabellevel = 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 TestPerilakuJumlah elemen (3 × 2 nilai)
default ('exhaustive')produk kartesian semua kombinasi6
ParameterCombination = 'sequential'pasangan searah per indeks2

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:

matlab
% 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:

matlab
% --- 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;
end

Output yang Dihasilkan (dari uji_parametrik.m lengkap, bagian satu parameter):

text
== 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 lolos

Mari kita bedah baris-baris kode di atas:

  1. 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.
  2. Baris 16 (hasil = nilaiHuruf(masukan)): fungsi yang diuji dipanggil dengan masukan dari tabel — satu-satunya baris yang berubah bila kasus ditambah.
  3. Baris 17-19 (assert(strcmp(...), ...)): assert membandingkan hasil dengan harapan; pesan galat memuat nomor kasus, label, masukan, harapan, dan hasil aktual — padanan nama elemen testMetode(nilai=kecil) versi matlab.unittest.
  4. Bagian kedua (loop bersarang hargaDiskon): dua parameter diiterasi dengan loop bersarang sehingga 3 harga × 2 persen menghasilkan 6 kombinasi — padanan manual produk kartesian ParameterCombination default.

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.