- Makalah yang diumumkan Meta pada bulan Februari, "Automated Unit Test Improvement using Large Language Models at Meta", memperkenalkan alat bernama TestGen-LLM
- Tujuan alat ini adalah meningkatkan cakupan pengujian secara sepenuhnya otomatis, serta menjamin hasil yang lebih baik dibanding codebase yang sudah ada
- Karena Meta tidak merilis kode TestGen-LLM, diputuskan untuk mengimplementasikannya sendiri sebagai bagian dari open source Cover Agent
- Di sini dibagikan proses implementasi, temuan yang didapat, serta masalah yang dihadapi saat menggunakan TestGen-LLM pada codebase nyata
Standar untuk pembuatan pengujian otomatis
- Pembuatan pengujian otomatis dengan AI generatif bukan hal baru
- Sebagian besar LLM mahir dalam menghasilkan kode dan juga dapat membuat pengujian
- Masalah paling umum yang dihadapi developer saat membuat pengujian dengan LLM adalah sebagian besar pengujian yang dihasilkan tidak berjalan atau tidak menambah nilai
- Untuk mengatasinya, penulis TestGen-LLM mengajukan kriteria berikut untuk regression unit test:
- Apakah pengujian dapat dikompilasi dan dijalankan dengan benar?
- Apakah pengujian meningkatkan code coverage?
- Jika dua pertanyaan dasar ini tidak dapat dijawab, tidak ada alasan untuk menerima atau menganalisis pengujian hasil generasi LLM
- Jika lolos dari pertanyaan ini, barulah dilakukan review manual
- Seberapa baik pengujian tersebut ditulis?
- Seberapa banyak nilai nyata yang ditambahkan?
- Apakah memenuhi persyaratan tambahan?
Pendekatan TestGen-LLM dan hasil yang dilaporkan
- TestGen-LLM (dan Cover-Agent) berjalan sepenuhnya secara headless
- Pertama-tama sistem membuat banyak pengujian, lalu memfilter yang tidak dapat di-build/dijalankan, membuang yang tidak lolos, dan menyingkirkan yang tidak meningkatkan code coverage
- Dalam kasus yang sangat terkontrol, rasio pengujian yang lolos semua tahap dibanding total yang dihasilkan adalah 1:4, dan dalam skenario nyata penulis Meta melaporkan rasio 1:20
- Setelah proses otomatis, Meta membiarkan reviewer manusia menerima atau menolak pengujian
- Penulis makalah menyebutkan rasio penerimaan rata-rata 1:2, dengan tingkat penerimaan terbaik mencapai 73%
- Seperti dijelaskan dalam makalah, alat TestGen-LLM menghasilkan satu pengujian tunggal pada setiap eksekusi untuk ditambahkan ke test suite yang sudah ada dan sebelumnya ditulis oleh developer profesional
- Selain itu, alat ini tidak selalu menghasilkan pengujian untuk test suite yang diberikan
Implementasi Cover-Agent
- Cover-Agent v0.1 diimplementasikan sebagai berikut:
- Menerima input pengguna (file sumber yang akan diuji, test suite yang ada untuk ditingkatkan, laporan coverage, perintah build dan eksekusi test suite, target code coverage dan jumlah iterasi maksimum, konteks tambahan dan opsi prompt)
- Menghasilkan lebih banyak pengujian dengan gaya yang sama
- Memvalidasi pengujian tersebut menggunakan environment runtime (apakah bisa di-build dan lolos)
- Meninjau metrik seperti peningkatan code coverage untuk memastikan pengujian benar-benar menambah nilai
- Memperbarui test suite yang ada dan laporan coverage
- Mengulang sampai kode mencapai kriteria (ambang code coverage tercapai atau jumlah iterasi maksimum tercapai)
Masalah yang dihadapi saat mengimplementasikan dan meninjau TestGen-LLM
- Contoh dalam makalah menggunakan Kotlin untuk menulis pengujian, bahasa yang tidak sensitif terhadap spasi kosong
- Sebaliknya, pada bahasa seperti Python, tab dan spasi bukan hanya penting tetapi juga esensial bagi parser
- Model yang kurang canggih seperti GPT 3.5, bahkan dengan prompt eksplisit, tidak secara konsisten mengembalikan kode dengan indentasi yang tepat
- Contoh masalah yang timbul adalah test class yang ditulis dalam Python, di mana setiap fungsi pengujian harus diindentasi
- Hal ini harus dipertimbangkan di seluruh siklus hidup pengembangan, dan menambah kompleksitas di sekitar library prapemrosesan
- Agar Cover-Agent tangguh dalam skenario seperti ini, masih banyak hal yang perlu ditingkatkan
- Sebagai bagian dari alur Cover-Agent, ditambahkan kemampuan agar pengguna dapat memberikan input atau instruksi tambahan ke LLM (opsi
--additional-instructions)
- Dengan ini developer dapat menyesuaikan Cover-Agent dengan memberikan informasi tambahan yang spesifik untuk proyek
- Misalnya, instruksi ini dapat digunakan untuk mengarahkan Cover-Agent agar membuat set pengujian yang kaya dengan edge case yang bermakna
- Sejalan dengan tren umum makin meluasnya Retrieval-Augmented Generation(RAG) dalam aplikasi berbasis AI, dikonfirmasi bahwa konteks yang lebih banyak bersama pembuatan unit test memungkinkan pengujian berkualitas lebih tinggi dan tingkat kelulusan yang lebih tinggi
- Untuk pengguna yang ingin menambahkan library tambahan atau dokumen desain berbasis teks secara manual sebagai konteks bagi LLM demi meningkatkan proses pembuatan pengujian, disediakan opsi
--included-files
- Kode kompleks yang memerlukan banyak iterasi juga menghadirkan tantangan lain bagi LLM
- Saat pengujian yang gagal (atau tidak menambah nilai) mulai dihasilkan, ditemukan pola bahwa pengujian yang sama dan tidak diterima terus diusulkan ulang pada iterasi berikutnya
- Untuk mengatasinya, ditambahkan bagian "failed tests" ke dalam prompt agar umpan balik tersebut diteruskan ke LLM, sehingga model menghasilkan pengujian unik dan tidak pernah mengulang pengujian yang dianggap tidak dapat digunakan (misalnya rusak atau tidak cukup meningkatkan coverage)
- Masalah lain yang muncul sepanjang proses ini adalah tidak dapat menambahkan import library saat memperluas test suite yang ada
- Developer dalam proses pembuatan pengujian kadang bisa terlalu sempit pandangannya dengan hanya menggunakan satu pendekatan terhadap testing framework
- Selain banyaknya mocking framework yang beragam, library lain juga dapat membantu mencapai test coverage
- Karena makalah TestGen-LLM (dan Cover-Agent) bertujuan memperluas test suite yang ada, merombak sepenuhnya seluruh test class berada di luar cakupan
- Ini adalah keterbatasan dari perluasan pengujian dibanding pembuatan pengujian, dan direncanakan untuk ditangani pada iterasi mendatang
- Penting untuk membedakan bahwa dalam pendekatan TestGen-LLM, review manual developer diperlukan untuk setiap pengujian sebelum pengujian berikutnya diusulkan
- Sebaliknya, pada Cover-Agent, sistem menghasilkan, memvalidasi, dan mengusulkan sebanyak mungkin pengujian tanpa intervensi manual selama proses, hingga persyaratan coverage tercapai (atau berhenti pada iterasi maksimum)
- Ini menciptakan pendekatan pembuatan pengujian otomatis yang tidak mengganggu, berjalan di background dengan memanfaatkan AI, sehingga developer dapat meninjau seluruh test suite sekali saja setelah proses selesai
Kesimpulan dan rencana ke depan
- Banyak orang (termasuk saya sendiri) menaruh harapan pada makalah dan alat TestGen-LLM, tetapi posting ini juga membahas keterbatasannya
- Saya masih menganggap kita berada di era AI assistant, belum AI teammate yang menjalankan workflow sepenuhnya otomatis
- Di saat yang sama, alur yang dirancang dengan baik dapat membantu developer menghasilkan kandidat pengujian secara otomatis dan meningkatkan code coverage dalam waktu yang jauh lebih singkat, dan ini yang ingin terus dikembangkan dan dibagikan di Cover-Agent
- Metode state-of-the-art yang terkait dengan domain pembuatan pengujian akan terus dikembangkan dan diintegrasikan ke repositori open source Cover-Agent
- Diharapkan siapa pun yang tertarik pada AI generatif untuk testing dapat berkolaborasi dan membantu memperluas kemampuan Cover Agent, sekaligus menginspirasi peneliti untuk memanfaatkan alat open source ini guna mengeksplorasi teknik pembuatan pengujian baru
- Roadmap pengembangan telah ditambahkan ke repositori open source Cover-Agent di GitHub, dan diharapkan ada kontribusi ke repositori tersebut baik mengikuti roadmap maupun berdasarkan ide masing-masing
- Visi Cover-Agent adalah pada akhirnya berjalan otomatis untuk semua permintaan pull pre/post, lalu secara otomatis mengusulkan peningkatan regression test yang telah diverifikasi berfungsi dan meningkatkan code coverage
- Dibayangkan Cover-Agent akan secara otomatis memindai codebase dan membuka PR dengan test suite
- Mari manfaatkan AI untuk menangani pekerjaan yang tidak kita sukai dengan lebih efisien!
Belum ada komentar.