69 tes yang ditulis oleh AI berhasil melewati sebuah modul Python, namun sebuah eksperimen menunjukkan bahwa pendekatan pembuatan tes yang ditargetkan berhasil menangkap 44 dari 53 kesalahan (fault) yang disuntikkan. Prototipe yang dikembangkan selama akhir pekan ini membuktikan kelemahan mendasar dalam penulisan tes menggunakan large-language-model (LLM) saat ini: tanpa loop umpan balik yang memeriksa apakah sebuah tes benar-benar gagal saat menghadapi cacat yang diketahui, rangkaian tes yang dihasilkan dapat terlihat sempurna padahal melewatkan bug yang seharusnya ia temukan.

Mengapa eksperimen ini penting

Pembuatan tes otomatis menjanjikan penyempitan celah antara kode dan cakupan (coverage), terutama saat pengembang mengandalkan LLM untuk menyusun unit test. Sebagian besar tolok ukur (benchmark) publik mengevaluasi keberhasilan dengan mengukur cakupan baris—apakah setiap baris kode berjalan selama pengujian. Metrik tersebut dapat menyesatkan: sebuah baris mungkin dieksekusi tanpa tes tersebut pernah melakukan asersi terhadap perilaku yang benar. Mutation testing mengisi titik buta tersebut dengan sengaja merusak kode sumber (membalikkan perbandingan, menghapus pernyataan, dll.) dan mengamati apakah tes yang ada dapat mendeteksi perubahan tersebut. Jika versi yang telah dimutasi tetap lolos, berarti rangkaian tes tersebut melewatkan kesalahan yang nyata.

Eksperimen ini membandingkan tiga cara memberikan prompt kepada LLM untuk menghasilkan tes:

  • Bulk prompting – satu permintaan tunggal untuk “lebih banyak tes” menghasilkan 69 tes yang semuanya lolos pada kode yang tidak dimodifikasi, tetapi hanya menangkap 9 dari 53 mutasi.
  • One-test-per-call, untargeted – model diminta berulang kali untuk satu tes tunggal tanpa panduan mengenai kesalahan yang ada; ia hanya menangkap 2 mutasi.
  • Targeted prompting dengan mutation-testing gate – model melihat setiap mutasi yang terlewat dan diminta untuk menulis tes yang akan gagal pada kode yang dimutasi tetapi lolos pada versi yang bersih. Pendekatan ini menghasilkan 44 tes yang berhasil menangkap kesalahan.

Kontras yang mencolok—44 berbanding 9 atau 2—menunjukkan bahwa loop umpan balik yang sempit dan berorientasi pada kesalahan dapat secara drastis meningkatkan kemampuan penemuan cacat dari tes yang dihasilkan AI.

Cara kerja mutation-testing gate

  1. Suntikkan mutasi – harness membuat perubahan kecil dan sistematis pada sumber asli (misalnya, membalikkan kondisi, menghapus baris). Setiap mutasi mewakili potensi bug.
  2. Jalankan rangkaian tes saat ini – jika rangkaian tes tetap lolos, mutasi tersebut tidak terdeteksi.
  3. Berikan prompt ke LLM – model menerima mutasi spesifik dan diminta untuk menghasilkan tes yang gagal pada kode yang dimutasi namun berhasil pada kode asli.
  4. Validasi tes baru – simpan tes hanya jika ia lolos pada kode bersih dan gagal pada versi yang dimutasi.
  5. Iterasi – ulangi untuk setiap mutasi yang belum terdeteksi.

"Gate" atau gerbang ini adalah langkah validasi tersebut. Ia menyaring tes apa pun yang tidak menunjukkan sensitivitas terhadap kesalahan yang ditargetkan, memastikan bahwa setiap tes yang dipertahankan memiliki nilai deteksi kesalahan yang terbukti.

Pelajaran dari angka-angka tersebut

  • Kode yang tidak terjangkau mendominasi kesalahan yang terlewat – Dalam basis kode yang sudah matang, banyak baris yang tidak pernah dijalankan oleh tes yang ada. Eksperimen menunjukkan bahwa sebagian besar mutasi yang tidak terdeteksi berada di wilayah yang tidak terjangkau tersebut.
  • Gate membuang tes yang valid karena alasan yang salah – Setiap tes yang ditolak lolos pada kode bersih; gate menghapusnya karena tes tersebut tidak gagal pada mutasi spesifik. Sebuah tes bisa saja sangat benar namun tidak relevan dengan kesalahan yang sedang diperiksa.
  • Tes yang ditargetkan sangat spesifik – Dari 44 tes yang berhasil, 36 menangkap tepat satu mutasi. Rangkaian tes tersebut menjadi kumpulan pemeriksaan yang sempit alih-alih asersi yang luas, sehingga menimbulkan pertanyaan tentang pemeliharaan (maintainability) dan over-fitting.

Apa yang tidak dicakup oleh hasil ini

Kekuatan pendekatan ini—fokusnya pada kesalahan yang diketahui—juga membatasi generalisasinya. Secara desain, model tidak didorong untuk menemukan bug baru yang belum terlihat; ia hanya belajar untuk “merespons” mutasi yang disajikan. Sebuah tes yang hanya gagal pada satu perubahan yang direkayasa mungkin tidak memberikan kepercayaan diri terhadap regresi dunia nyata yang bermanifestasi secara berbeda. Selain itu, eksperimen ini menggunakan modul yang sengaja dibuat kecil dan harness yang dibuat secara manual; menskalakan metode ini ke basis kode yang besar dan heterogen dapat mengungkap hambatan performa (bottlenecks) dan biaya rekayasa (engineering overhead) yang lebih tinggi.

Implikasi bagi pengujian berbasis AI

  • Metrik itu penting – Hanya mengandalkan line coverage dapat memberikan rasa aman yang palsu. Pengujian mutasi menawarkan ukuran yang lebih berpusat pada perilaku, dan mengintegrasikannya ke dalam evaluation loop dapat mengungkap titik buta lebih awal.
  • Loop umpan balik meningkatkan hasil – Peningkatan drastis dari gate tersebut menegaskan bahwa LLM mendapat manfaat dari prompt korektif yang iteratif daripada pembuatan sekali jalan (one-shot generation).
  • Transparansi alat sangat penting – Penulis menemukan 11 bug dalam measurement harness itu sendiri, yang awalnya menggelembungkan tingkat keberhasilan yang dilaporkan. Memublikasikan harness bersama dengan hasil memungkinkan komunitas untuk mengaudit dan meningkatkan evaluation pipeline.

Apa yang perlu diperhatikan selanjutnya

  • Pipeline hibrida – Menggabungkan pembuatan tes massal untuk keluasan dengan penyempurnaan berbasis mutasi yang terarah untuk kedalaman dapat menghasilkan rangkaian tes yang seimbang yang mencakup kode sekaligus memvalidasi perilaku.
  • Verifikasi harness otomatis – Seiring semakin banyaknya peneliti yang mengadopsi pengujian mutasi sebagai tolok ukur, alat yang memvalidasi sendiri set mutasi dan alur eksekusinya akan menjadi sangat penting untuk menghindari kesalahan pengukuran yang tersembunyi.
  • Studi generalisasi – Pekerjaan di masa depan harus menguji apakah tes yang dihasilkan melalui gate tetap efektif saat diterapkan pada bug yang belum terlihat atau di lingkungan produksi, guna menjawab kekhawatiran mengenai keterbatasan cakupan.

Kesimpulan

Loop umpan balik pengujian mutasi yang sederhana dapat mengubah LLM yang menulis tes yang lolos (passing) tetapi tidak berguna menjadi alat yang benar-benar menemukan kesalahan. Eksperimen ini menunjukkan bahwa tanpa gate semacam itu, tes yang dihasilkan AI berisiko hanya menjadi sekadar lapisan cakupan (veneer of coverage), namun melewatkan bug yang seharusnya mereka tangkap. Bagi pengembang maupun peneliti, memasangkan pembuatan tes dengan validasi yang berfokus pada perilaku bukan lagi sebuah pilihan—itu adalah satu-satunya cara untuk memastikan bahwa pengujian otomatis memberikan keamanan nyata pada codebase.