Topik ini memperkenalkan Common Test, kerangka pengujian OTP untuk uji sistem yang lebih besar: suite sebagai modul berkonvensi, siklus hidup konfigurasi dari suite sampai kasus, dan laporan hasil yang tertulis ke berkas. Contohnya adalah suite dua kasus yang dijalankan nyata dari shell.
Suite dan siklus hidupnya#
Common Test menyebut modul ujinya suite, dengan nama yang wajib diakhiri _SUITE. Fungsi all/0 mendeklarasikan daftar kasus, dan keluarga fungsi konfigurasi membentuk siklus hidupnya: init_per_suite/1 berjalan sekali sebelum seluruh suite, end_per_suite/1 sekali setelahnya, sementara init_per_testcase/2 dan end_per_testcase/2 berjalan pada tiap kasus:
-module(uji_ct_SUITE).
-export([all/0, init_per_suite/1, end_per_suite/1, t_penjumlahan/1, t_gabungan/1]).
all() -> [t_penjumlahan, t_gabungan].
init_per_suite(Config) -> [{awal, 40} | Config].
end_per_suite(_Config) -> ok.
t_penjumlahan(_Config) -> 40 + 2 = 42, {comment, "penjumlahan dasar"}.
t_gabungan(Config) -> 40 = proplists:get_value(awal, Config), ok.List konfigurasi berupa proplist mengalir melalui seluruh siklus, dan inilah saluran yang menyampaikan koneksi, folder kerja, atau state yang disiapkan sebelum uji. Kasus bernama t_penjumlahan mengembalikan {comment, ...} sebagai catatan opsional yang tampil pada laporan, dan t_gabungan membaca nilai yang ditanam init_per_suite/1, membuktikan aliran konfigurasinya bekerja.
Menjalankan dan membaca laporan#
Suite dijalankan dari shell dengan ct:run_test/1, dan Common Test menyusun laporan lengkap ke folder hasilnya:
Common Test: Running make in test directories...
CWD set to: "/tmp/mod8/[email protected]_12.11.50"
TEST INFO: 1 test(s), 2 case(s) in 1 suite(s)
Testing tmp.mod8.uji_ct_SUITE: Starting test, 2 test cases
Testing tmp.mod8.uji_ct_SUITE: TEST COMPLETE, 2 ok, 0 failed of 2 test casesLaporan lengkap tertulis berupa berkas HTML di dalam folder ct_run.* yang dibuat saat eksekusi, lengkap dengan rincian tiap kasus, log, dan jejak kegagalan. Pada proyek rebar3, perintah rebar3 ct menjalankan seluruh suite dan menyimpan laporannya di _build/test/logs, dan kumpulan suite dapat dikelompokkan lewat groups dan testcase_groups untuk dipilih saat berjalan.
Kapan Common Test, kapan EUnit#
Keduanya bawaan OTP dan saling melengkapi. EUnit berangkat dari unit murni: cepat, ringkas, dan berhenti pada batas proses yang diuji. Common Test menargetkan uji integrasi dan sistem: konfigurasi berlapis, beberapa node, perlakuan data eksternal, dan laporan operasional yang dibaca orang lain. Konvensi penulisannya pun berbeda: EUnit menyusun uji sebagai data dan dapat dikomposisikan bebas, sedangkan Common Test mengikuti kontrak nama fungsi yang kaku tetapi seragam antar suite. Pada proyek nyata, dua kerangka ini hidup berdampingan tanpa gesekan: unit test di EUnit untuk modul murni, dan suite Common Test untuk lingkup yang menyentuh infrastruktur.
Konfigurasi dari berkas dan pembacaan proplist#
Kekuatan utama Common Test dibanding EUnit ada pada konfigurasi datanya. Suite dapat meminta berkas konfigurasi lewat makro ?config dan daftar require pada modul, dengan berkas berformat .config yang berisi proplist dan diberikan saat menjalankan uji lewat opsi ct:run_test/1:
{databases, [{host, "db-lokal"}, {port, 5432}]}.
{folder_kerja, "/var/tmp/uji"}.Nilai yang dituntut suite tetapi tidak disediakan membuat uji berhenti dengan pesan yang jelas, sehingga ketergantungan lingkungan tidak terlewat diam-diam. Proplist juga menjadi tempat penyimpanan data antar tahap, seperti {awal, 40} pada contoh utama topik ini.
Grup dan laporan#
Kasus yang banyak dikelompokkan lewat fungsi groups/0 beserta atribut eksekusinya, seperti berurutan atau paralel, dan grup dipanggil dari all/0 lewat tuple {group, NamaGrup}. Kombinasi ini memungkinkan kasus infrastruktur berat dijalankan sekali dan kasus cepat diulang per iterasi, tanpa memindahkan kode uji. Hasilnya selalu tertulis: folder ct_run.* berisi laporan HTML dengan rincian tiap kasus, log keluaran, dan jejak kegagalan, yang menjadi bahan bacaan utama saat uji gagal di mesin lain dan bukan di mesin pengembangnya.
Kesalahan umum#
- Menaruh penyiapan berat di tiap kasus padahal boleh sekali per suite. Kasus yang masing-masing membuka koneksi sendiri memakan waktu tanpa alasan. Pindahkan ke init_per_suite bila keadaannya boleh dibagi, atau tetapkan di init_per_testcase bila tiap kasus memang butuh keadaan yang bersih.
- Membaca laporan hanya dari baris akhir. Keluaran
TEST COMPLETEmenyembunyikan kasus yang memicu error di tengah jalan, dan berkas HTML memuat peristiwa itu dengan urutan yang benar. - Mencampur unit dan integrasi dalam satu suite. Suite yang sebagian cepat dan sebagian menyentuh jaringan membuat pemilihan eksekusi menjadi samar. Pisahkan ke suite berbeda dan kelompokkan lewat grup.
Ringkasan#
- Suite adalah modul berakhiran _SUITE dengan all/0 sebagai daftar kasus dan keluarga init/end sebagai siklus hidupnya.
- List konfigurasi mengalir dari init_per_suite ke tiap kasus dan kembali ke end_per_suite.
- ct:run_test/1 menjalankan suite dari shell dan rebar3 ct untuk seluruh proyek, dengan laporan HTML tertulis.
- EUnit untuk unit murni, Common Test untuk integrasi dan sistem, dan keduanya hidup berdampingan.
Referensi#
- Common Test User Guide — Ericsson — Panduan resmi menulis suite, konfigurasi, dan grup.
- ct — Ericsson — Referensi penggerak uji dan pembacaan laporannya.
- Learn You Some Erlang for Great Good! — Fred Hebert — Bab Common Test dengan contoh suite nyata.