Apa itu Mutation Testing?

Mutation testing (atau sering juga disebut mutation code testing) adalah salah satu bentuk dari white box testing, di mana penguji secara sengaja mengubah bagian tertentu dari kode sumber aplikasi untuk menguji apakah rangkaian pengujian (test suite) yang digunakan bisa mendeteksi perubahan tersebut. Mutasi yang ditambahkan bertujuan untuk menyebabkan kesalahan (error) di program. Jadi, tujuan utama mutation testing adalah untuk mengevaluasi seberapa baik alat uji software bekerja—bukan untuk mengecek kualitas aplikasinya itu sendiri.
Biasanya, mutation testing ini dipakai saat melakukan unit testing. Target utamanya adalah memastikan bahwa pengujian yang dilakukan mampu menangkap kode yang belum diuji secara menyeluruh atau ada bug tersembunyi yang lolos dari metode pengujian lain. Mutasi dilakukan dengan mengubah satu baris kode, misalnya menghapus pernyataan, menduplikasi, mengganti ekspresi true jadi false, atau memodifikasi variabel tertentu. Kode yang sudah dimutasi kemudian dijalankan dan dibandingkan hasilnya dengan kode asli.

Kalau hasil pengujian antara kode asli dan kode hasil mutasi sama aja, berarti ada dua kemungkinan: entah kodenya nggak dijalankan, atau test suite-nya belum cukup kuat untuk mendeteksi perubahannya. Kalau begitu, test-nya perlu diperbaiki biar lebih efektif. Sebaliknya, kalau test-nya berhasil mendeteksi perubahan (hasilnya beda), berarti pengujian sukses dan mutasi bisa dihapus (dibunuh).

Setelah itu, kita bisa kasih skor buat test-nya berdasarkan mutation score, yang rumusnya kayak gini:

Mutation score = (jumlah mutant yang berhasil dibunuh / total mutant yang dibuat) x 100

Skor 100% berarti test-nya udah cukup kuat.

Kenapa Mutasi Bisa Muncul?

Mutasi di sini maksudnya adalah perubahan kecil (secara sintaks) pada pernyataan di program. Biasanya perubahan ini melibatkan satu variabel yang menyebabkan bug. Contoh sederhananya, pernyataan `(A<B)` diubah jadi `(A>B)`.
Penguji sengaja menambahkan mutasi ke dalam kode program. Nantinya akan dibuat beberapa versi dari program asli, masing-masing dengan mutasi berbeda, atau disebut juga mutant. Mutant-mutant ini kemudian diuji bareng dengan versi original program. Hasil pengujiannya nanti dibandingkan satu sama lain.

Kalau pengujian menunjukkan perbedaan hasil antara mutant dan kode asli, berarti mutasinya berhasil dibunuh dan nggak perlu disimpan. Tapi kalau hasilnya sama, mutant itu dianggap masih hidup (live mutant) dan bisa disimpan buat diuji lagi nanti.

Ada beberapa istilah penting:

  • Live mutants: mutant yang masih lolos dari test.
  • Killed mutants: mutant yang berhasil terdeteksi dan dibunuh.
  • Equivalent mutants: mutant yang secara sintaks beda, tapi secara makna masih sama kayak kode aslinya. Mutant jenis ini nggak dihitung dalam skor.

Jenis-Jenis Mutation Testing

Secara umum, mutation testing dibagi jadi tiga tipe utama:

  • Statement mutation. Menghapus atau mengganti statement dengan statement lain. Contohnya: “A = 10 dan B = 5” diubah jadi “A = 5 dan B = 15.”
  • Value mutation. Mengubah nilai untuk nyari potensi error. Contoh: “A = 15” diubah jadi “A = 10” atau “A = 25.”
  • Decision mutation. Operator logika atau aritmatika diganti. Misalnya, “(A<B)” jadi “(A>B).”

Kelebihan dan Kekurangan

Mutation testing punya beberapa kelebihan, di antaranya:

  • Membantu mengidentifikasi bagian kode atau test yang lemah.
  • Menyediakan deteksi error yang lebih dalam dan menyeluruh.
  • Meningkatkan penggunaan framework OOP dan unit test jika organisasi menggunakannya.
  • Karena framework dan unit test makin umum, tools untuk mutation testing juga makin banyak tersedia.
  • Membantu organisasi menilai seberapa efektif alat uji mereka dengan menggunakan skor.

Tapi, ada juga kekurangannya:

  • Kurang praktis kalau nggak pakai tools otomatis.
  • Bisa makan waktu dan biaya karena jumlah mutant yang perlu diuji bisa sangat banyak.

Tools untuk Mutation Testing

Ada beberapa tools open-source yang bisa bantu mempercepat proses pembuatan mutant, contohnya:

  • Insure++.
  • Jester (untuk JUnit).
  • PIT (untuk Java dan JVM).
  • MuClipse (plugin untuk Eclipse).

Tools ini bisa dipakai buat menjalankan unit test ke kode yang sudah dimodifikasi otomatis, dan juga bisa bikin laporan tentang mutant yang berhasil dibunuh, yang masih hidup, yang nggak ter-cover, error karena timeout, memori, atau runtime error lainnya.

Cara Melakukan Mutation Testing

Berikut langkah-langkah umum dalam mutation testing:

  1. Buat unit test-nya dulu.
  2. Buat kode program yang akan diuji dengan test tersebut.
  3. Jalankan mutation test awal buat pastikan kode dan test udah saling cocok.
  4. Lakukan mutasi pada kode, lalu jalankan kembali unit test-nya. Setiap mutant sebaiknya punya satu error untuk menguji seberapa efektif test-nya.
  5. Bandingkan hasil test antara kode asli dan kode mutant.
    • Kalau hasilnya beda, artinya test berhasil mendeteksi mutant.
    • Kalau hasilnya sama, test gagal mendeteksi dan mutant disimpan.
  6. Terakhir, hitung skor mutasinya sebagai persentase dari mutant yang berhasil dibunuh.

Mutation Testing vs Regression Testing

Sekilas, regression testing mungkin kelihatan mirip sama mutation testing. Tapi sebenarnya beda tujuan.
Regression testing dilakukan buat ngecek apakah perubahan baru di program bikin fungsi lama jadi rusak. Sementara itu, mutation testing adalah tentang menyisipkan perubahan kecil ke dalam kode untuk ngetes apakah pengujian yang ada cukup kuat buat mendeteksi bug.

Pelajari lebih lanjut tentang regression testing dan hal-hal yang perlu dipertimbangkan saat memilih tools-nya.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *