Topik ini membahas cara menguji program COBOL secara sistematis, mulai dari pengujian satu paragraf logika secara terisolasi dengan harness sederhana, pola pengujian program lewat berkas masukan dan berkas harapan, sampai peran kerangka pengujian korporasi seperti IBM zUnit dan Micro Focus Unit Test Framework. Harness yang dibangun berisi tabel kasus uji pada WORKING-STORAGE, perulangan pemanggilan, penghitung lulus dan gagal, serta keluaran ringkasan. Hasil akhirnya adalah bukti perilaku logika yang dapat diulang kapan saja dengan perintah yang sama.
Satuan yang diuji dan isolasinya#
Satuan terkecil yang diuji pada program COBOL adalah paragraf yang bekerja atas field-field WORKING-STORAGE, sebagaimana paragraf HITUNGBUNGA pada contoh topik ini yang menerima saldo dan persen lalu menghasilkan bunga. Paragraf semacam itu disebut logika murni karena tidak menyentuh berkas, terminal, maupun kondisi luar lainnya, sehingga hasilnya hanya ditentukan oleh masukannya. Isolasi semacam ini memudahkan pengujian karena setiap kasus cukup disiapkan dengan MOVE ke field masukan, dijalankan dengan PERFORM, lalu hasilnya dibandingkan dengan nilai harapan.
Keputusan desain yang mendukung pengujian adalah memisahkan logika perhitungan dari masukan dan keluaran berkas, sehingga paragraf perhitungan dapat diuji tanpa menyiapkan satu berkas pun. Pola ini paling berharga bagi logika yang keputusannya berdampak besar, misalnya perhitungan total, batas pinjaman, atau pemeriksaan tanggal, karena cacat pada logika semacam itu baru diketahui setelah data produksi terpengaruh. Nama paragraf yang jelas seperti HITUNGBUNGA turut membuat daftar kasus uji berfungsi sebagai dokumentasi perilaku paragraf tersebut.
Harness kasus uji dalam tabel#
Harness adalah program penguji kecil yang ditulis khusus untuk menjalankan kasus uji secara otomatis. Harness menyimpan daftar kasus uji sebagai tabel WORKING-STORAGE yang berisi masukan dan nilai harapan setiap kasus. Nilai awal tabel ditulis sebagai rangkaian FILLER berbentuk string, kemudian REDEFINES menumpuk TABEL-KASUS di atasnya agar nilai yang sama dapat dibaca sebagai field numerik per kasus. Setiap entri berukuran 16 karakter, yaitu saldo tujuh digit, persen dua digit, dan harapan tujuh digit.
IDENTIFICATION DIVISION.
PROGRAM-ID. UJIBUNGA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 DATA-KASUS.
05 FILLER PIC X(16) VALUE "0100000050005000".
05 FILLER PIC X(16) VALUE "0200000100020000".
05 FILLER PIC X(16) VALUE "0050000000000000".
05 FILLER PIC X(16) VALUE "0999999030029999".
05 FILLER PIC X(16) VALUE "1000000120120000".
05 FILLER PIC X(16) VALUE "0250000040001000".
01 TABEL-KASUS REDEFINES DATA-KASUS.
05 ISI-KASUS OCCURS 6 TIMES.
10 KASUS-SALDO PIC 9(07).
10 KASUS-PERSEN PIC 99.
10 KASUS-HARAP PIC 9(07).
01 INDEKS-KASUS PIC 9(2).
01 SALDO-UJI PIC 9(07).
01 PERSEN-UJI PIC 99.
01 BUNGA-HASIL PIC 9(07).
01 JUMLAH-LULUS PIC 9(2) VALUE 0.
01 JUMLAH-GAGAL PIC 9(2) VALUE 0.
PROCEDURE DIVISION.
MULAI.
PERFORM VARYING INDEKS-KASUS FROM 1 BY 1
UNTIL INDEKS-KASUS > 6
MOVE KASUS-SALDO(INDEKS-KASUS) TO SALDO-UJI
MOVE KASUS-PERSEN(INDEKS-KASUS) TO PERSEN-UJI
PERFORM HITUNGBUNGA
IF BUNGA-HASIL = KASUS-HARAP(INDEKS-KASUS)
ADD 1 TO JUMLAH-LULUS
DISPLAY "KASUS " INDEKS-KASUS
" LULUS BUNGA " BUNGA-HASIL
ELSE
ADD 1 TO JUMLAH-GAGAL
DISPLAY "KASUS " INDEKS-KASUS
" GAGAL HARAP " KASUS-HARAP(INDEKS-KASUS)
" HASIL " BUNGA-HASIL
END-IF
END-PERFORM
DISPLAY "RINGKASAN LULUS " JUMLAH-LULUS
" GAGAL " JUMLAH-GAGAL
STOP RUN.
HITUNGBUNGA.
COMPUTE BUNGA-HASIL = SALDO-UJI * PERSEN-UJI / 100.KASUS 01 LULUS BUNGA 0005000
KASUS 02 LULUS BUNGA 0020000
KASUS 03 LULUS BUNGA 0000000
KASUS 04 LULUS BUNGA 0029999
KASUS 05 LULUS BUNGA 0120000
KASUS 06 GAGAL HARAP 0001000 HASIL 0010000
RINGKASAN LULUS 05 GAGAL 01Kompilasi harness dengan perintah berikut.
# kompilasi harness pengujian
cobc -x uji-bunga.cblJalankan ./uji-bunga dan perhatikan pola keluarannya. Perulangan VARYING menelusuri keenam kasus, memanggil HITUNGBUNGA untuk setiap kasus, lalu menambah penghitung lulus atau gagal sesuai perbandingan. Kasus 04 memperlihatkan efek pemotongan desimal karena 999999 dikali 3 dibagi 100 menghasilkan 29999,97 yang terpotong menjadi 29999. Kasus 06 sengaja diberi nilai harapan yang keliru untuk memperlihatkan bahwa harness benar-benar mendeteksi ketidakcocokan dan melaporkannya pada baris GAGAL beserta ringkasan LULUS 05 GAGAL 01.
Pengujian program lewat berkas#
Program batch pada umumnya membaca berkas masukan dan menulis berkas keluaran, sehingga pengujian seluruh programnya mengikuti pola yang berbeda dari harness internal. Polanya terdiri atas tiga langkah, yaitu menyiapkan berkas masukan yang isinya sudah diketahui, menjalankan program terhadap berkas itu, lalu membandingkan berkas keluaran dengan berkas harapan yang telah disusun lebih dahulu. Perbandingan dilakukan dengan perintah diff, dan keluaran diff yang kosong berarti program berperilaku sesuai harapan untuk kasus tersebut.
Pasangan berkas masukan dan berkas harapan disimpan bersama kode sumber, sehingga setiap perubahan program dapat diuji ulang dengan cara yang sama dan hasilnya dapat diperiksa oleh alat otomatis maupun oleh peninjau manusia. Pola ini juga menjadi dasar pengujian regresi, yaitu menjalankan ulang seluruh pasangan berkas setiap kali program berubah. Kegagalan yang tidak terduga pun lebih mudah dianalisis, karena berkas masukan yang sama selalu dapat dijalankan ulang. Pola ini menempatkan perilaku program utuh sebagai objek uji, sedangkan harness pada bagian sebelumnya menempatkan paragraf sebagai objek ujinya.
Kerangka pengujian korporasi#
Harness buatan sendiri memadai untuk latihan dan program kecil, sedangkan lingkungan korporasi menyediakan kerangka khusus dengan fasilitas yang lebih lengkap. IBM menyediakan zUnit sebagai fasilitas pengujian unit untuk Enterprise COBOL pada z/OS, dengan kasus uji yang dikelola dari IDE dan test runner yang dihasilkan secara otomatis, serta integrasi dengan alur build IBM Dependency-Based Build. Micro Focus menyertakan Unit Test Framework sebagai bagian dari Visual COBOL, sehingga kasus uji unit dapat ditulis dan dijalankan langsung dari IDE tersebut pada lingkungan pengembangan modern. Keduanya mengambil alih kerja manual harness melalui pencatatan hasil, pelaporan, dan integrasi pipeline yang lebih rapi, tetapi prinsipnya tetap sama, yaitu kasus uji berisi masukan dan harapan, lalu ringkasan lulus gagal dilaporkan setiap kali dijalankan. Pemilihan kerangkanya mengikuti platform yang digunakan, yaitu zUnit untuk Enterprise COBOL pada z/OS dan Unit Test Framework untuk lingkungan Visual COBOL, sedangkan keterampilan menyusun kasus masukan dan harapan seperti pada harness sebelumnya tetap menjadi dasarnya.
Kesalahan umum#
Nilai harapan dihitung dengan menyalin rumus yang sama dengan logika yang diuji. Cacat pada rumus ikut tersalin sehingga kasus tetap lulus padahal hasilnya salah. Hitung nilai harapan secara terpisah, baik dengan perhitungan manual maupun dari spesifikasi.
Kasus gagal dibiarkan tanpa tindak lanjut. Penghitung gagal hanya berguna apabila baris GAGAL diperlakukan sebagai temuan yang harus dijelaskan atau diperbaiki sebelum program dikirim, dan ringkasan GAGAL 00 dijadikan syarat selesai.
Penghitung lulus dan gagal menggunakan PIC 9 sehingga meluap saat kasusnya lebih dari sembilan. Gunakan PIC 9(2) agar penghitung memuat sampai 99 kasus.
Kasus uji hanya mencakup jalur normal. Sertakan kasus nol dan kasus batas, misalnya persen 00 dan saldo terbesar yang mungkin, karena di sanalah perhitungan paling sering keliru dan perilaku pembulatannya paling perlu didokumentasikan.
Harness dijalankan sekali lalu dilupakan. Paragraf yang disunting tanpa menjalankan ulang seluruh kasus memberi rasa aman palsu, karena itu jalankan ulang harness setiap kali paragraf yang diuji berubah.
Ringkasan#
- Paragraf logika murni adalah satuan uji yang paling mudah, karena masukan dan harapannya cukup berupa field WORKING-STORAGE.
- Harness berisi tabel kasus uji, perulangan pemanggilan, penghitung lulus gagal, dan keluaran ringkasan.
- Program batch diuji utuh dengan pasangan berkas masukan dan berkas harapan yang dibandingkan menggunakan
diff. - IBM zUnit dan Micro Focus Unit Test Framework menyediakan fasilitas setara pada skala korporasi dengan integrasi IDE dan build.
Referensi#
- IBM Enterprise COBOL for z/OS documentation — IBM — dokumentasi Enterprise COBOL yang memuat fasilitas pengujian unit termasuk zUnit.