oleh Juan Altmayer Pizzorno dan Emery Berger di laboratorium PLASMA UMass Amherst.
CoverUp secara otomatis menghasilkan pengujian yang memastikan bahwa lebih banyak kode Anda yang diuji (yaitu, meningkatkan cakupan kodenya). CoverUp juga dapat membuat rangkaian pengujian dari awal jika Anda belum memilikinya. Pengujian baru ini didasarkan pada kode Anda, sehingga berguna untuk pengujian regresi.
CoverUp dirancang untuk bekerja sama dengan kerangka pengujian pytest. Untuk menghasilkan pengujian, pertama-tama alat ini mengukur cakupan suite Anda menggunakan SlipCover. Kemudian memilih bagian kode yang memerlukan pengujian lebih lanjut (yaitu, kode yang tidak ditemukan). CoverUp kemudian terlibat dalam percakapan dengan LLM, meminta pengujian, memeriksa hasil untuk memverifikasi bahwa hasil tersebut berjalan dan meningkatkan cakupan (sekali lagi menggunakan SlipCover), dan meminta kembali penyesuaian jika diperlukan. Terakhir, CoverUp secara opsional memeriksa apakah pengujian baru tersebut terintegrasi dengan baik, mencoba menyelesaikan masalah apa pun yang ditemukan.
Untuk rincian teknis dan evaluasi lengkap, lihat makalah arXiv kami, CoverUp: Pembuatan Tes Berbasis LLM yang Dipandu Cakupan (PDF).
CoverUp tersedia dari PyPI, jadi Anda dapat menginstalnya cukup dengan
$ python3 -m pip install coverup
CoverUp dapat digunakan dengan model OpenAI, Anthropic, atau AWS Bedrock; hal ini mengharuskan detail akses didefinisikan sebagai variabel lingkungan shell: OPENAI_API_KEY
, ANTHROPIC_API_KEY
atau AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
.
Misalnya, untuk OpenAI Anda akan membuat akun, memastikan akun tersebut memiliki saldo positif, lalu membuat kunci API, menyimpan "kunci rahasia" (biasanya berupa string yang dimulai dengan sk-
) dalam variabel lingkungan bernama OPENAI_API_KEY
:
$ export OPENAI_API_KEY= < ...your-api-key... >
Jika modul Anda bernama mymod
, sumbernya ada di bawah src
dan pengujiannya di bawah tests
, Anda dapat menjalankan CoverUp sebagai
$ coverup --source-dir src/mymod --tests-dir tests
CoverUp kemudian membuat tes bernama test_coverup_N.py
, dengan N
adalah angka, di bawah direktori tests
.
Di sini kami memiliki CoverUp yang membuat tes tambahan untuk paket Flask yang populer:
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
Hanya dalam satu menit, CoverUp meningkatkan cakupan pengujian Flask dari 90,9% menjadi 94,4%.
Saat mengevaluasi setiap pengujian yang baru dibuat, CoverUp mengeksekusinya beberapa kali dalam upaya mendeteksi pengujian yang tidak stabil; yang dapat disesuaikan dengan opsi --repeat-tests
dan --no-repeat-tests
. Jika CoverUp mendeteksi bahwa tes yang baru dibuat tidak stabil, LLM akan diminta untuk melakukan koreksi.
CoverUp hanya menambahkan pengujian ke rangkaian pengujian yang, jika dijalankan sendiri, akan lolos dan meningkatkan cakupan. Namun, pengujian mungkin saja "mencemari" negara, mengubahnya sedemikian rupa sehingga menyebabkan pengujian lainnya gagal. Secara default, CoverUp menggunakan plugin pytest-cleanslate untuk mengisolasi pengujian, mengatasi polusi pengujian (dalam memori); yang dapat dinonaktifkan dengan meneruskan opsi --no-isolate-tests
. CoverUp juga dapat diminta untuk menemukan dan menonaktifkan modul atau fungsi pengujian yang menimbulkan polusi ( --disable-polluting
) atau cukup menonaktifkan pengujian yang gagal (``--disable-failing`).
Untuk mengevaluasi tes yang dihasilkan oleh LLM, CoverUp harus menjalankannya. Untuk keamanan terbaik dan meminimalkan risiko kerusakan pada sistem Anda, kami menyarankan Anda menjalankan CoverUp dengan Docker.
Grafik menunjukkan CoverUp dibandingkan dengan CodaMosa, generator tes berbasis pencarian canggih berdasarkan generator tes Pynguin. Untuk eksperimen ini, CoverUp dan CodaMosa membuat pengujian "dari awal", yaitu mengabaikan rangkaian pengujian yang ada. Bilah tersebut menunjukkan perbedaan persentase cakupan antara CoverUp dan CodaMosa untuk berbagai modul Python; bilah hijau, di atas 0, menunjukkan bahwa CoverUp mencapai cakupan yang lebih tinggi.
Seperti yang ditunjukkan grafik, CoverUp mencapai cakupan yang lebih tinggi daripada CodaMosa untuk sebagian besar modul.
Ini adalah rilis awal CoverUp. Silakan menikmatinya, dan maafkan gangguan apa pun selagi kami berupaya memperbaikinya. Kami menerima laporan bug, laporan pengalaman, dan permintaan fitur (silakan buka masalah).