8 puan yazan xguru 2024-05-23 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Meta’nın şubatta yayımladığı "Automated Unit Test Improvement using Large Language Models at Meta" makalesinde TestGen-LLM adlı bir araç tanıtıldı
  • Bu aracın amacı, tamamen otomatik bir yöntemle test kapsamını artırmak ve mevcut kod tabanına kıyasla iyileşme sağladığını garanti etmek
  • Meta, TestGen-LLM kodunu yayımlamadığı için, bunu açık kaynak Cover Agent’ın bir parçası olarak doğrudan implemente etmeye karar verildi
  • Burada implementasyon süreci, keşfedilen noktalar ve TestGen-LLM’i gerçek bir kod tabanında kullanırken karşılaşılan sorunlar paylaşılıyor

Otomatik test üretiminin ölçütü

  • Üretken yapay zeka kullanarak otomatik test üretimi yeni bir şey değil
  • LLM’lerin çoğu kod üretiminde başarılı ve test üretimi de yapabiliyor
  • Geliştiricilerin LLM ile test üretirken karşılaştığı en yaygın sorun, üretilen testlerin büyük bölümünün ya çalışmaması ya da değer katmaması
  • Bunu aşmak için TestGen-LLM yazarları, regresyon birim testleri için şu ölçütleri öneriyor:
    1. Test düzgün şekilde derleniyor ve çalışıyor mu?
    2. Test kod kapsamını artırıyor mu?
  • Bu iki temel soruya yanıt verilemiyorsa, LLM’in ürettiği testleri kabul etmek veya analiz etmek için bir neden yok
  • Bu sorular geçilirse bir sonraki adım manuel inceleme
    • Test ne kadar iyi yazılmış?
    • Gerçekte ne kadar değer katabiliyor?
    • Ek gereksinimleri karşılıyor mu?

TestGen-LLM’in yaklaşımı ve bildirilen sonuçlar

  • TestGen-LLM (ve Cover-Agent) tamamen headless çalışıyor
  • Önce çok sayıda test üretiliyor; ardından build edilmeyen/çalışmayanlar filtreleniyor, başarılı olmayanlar atılıyor ve kod kapsamını artırmayanlar eleniyor
  • Çok kontrollü durumlarda, üretilen testlere kıyasla tüm aşamaları geçenlerin oranı 1:4; gerçek senaryolarda Meta yazarları 1:20 oranı bildiriyor
  • Otomatik süreçten sonra Meta, insan gözden geçirenlerin testleri kabul ya da reddetmesine izin veriyor
  • Makale yazarları, en iyi durumda %73 kabul oranı ve ortalama 1:2 kabul oranı gördüklerini söylüyor
  • Makalede anlatıldığı gibi TestGen-LLM aracı, her çalıştırmada uzman geliştiricilerin daha önce yazdığı mevcut test paketine eklenecek tek bir test üretiyor
  • Ayrıca verilen bir test paketi için mutlaka test üretmesi de gerekmiyor

Cover-Agent implementasyonu

  • Cover-Agent v0.1 şu şekilde implemente edildi:
    1. Kullanıcı girdilerini al (test edilecek kaynak dosya, iyileştirilecek mevcut test paketi, kapsam raporu, test paketini build etme ve çalıştırma komutları, kod kapsamı hedefi ve maksimum yineleme sayısı, ek bağlam ve prompt seçenekleri)
    2. Aynı stilde daha fazla test üret
    3. Çalışma zamanı ortamını kullanarak bu testleri doğrula (build oluyor mu ve geçiyor mu)
    4. Kod kapsamı artışı gibi metrikleri inceleyerek testin değer katıp katmadığını kontrol et
    5. Mevcut test paketini ve kapsam raporunu güncelle
    6. Kod ölçütlere ulaşana kadar yinele (kod kapsamı eşiğine ulaşılması veya maksimum yineleme sayısına gelinmesi)

TestGen-LLM’i implemente ederken ve incelerken karşılaşılan sorunlar

  • Makalede sunulan örneklerde, boşluk karakterlerinin önemli olmadığı Kotlin ile test yazımı kullanılıyor
  • Buna karşılık Python gibi dillerde tab ve boşluklar yalnızca önemli değil, aynı zamanda ayrıştırma motoru için de kritik
  • GPT 3.5 gibi daha az gelişmiş modeller, açıkça prompt verilse bile tutarlı biçimde doğru girintilenmiş kod döndürmüyor
  • Bunun sorun yarattığı örneklerden biri, her test fonksiyonunun girintilenmesi gereken Python ile yazılmış test sınıfları
  • Bu durum geliştirme yaşam döngüsü boyunca dikkate alınmak zorunda kaldı ve ön işleme kütüphanesi etrafında daha fazla karmaşıklık eklendi
  • Bu senaryolarda Cover-Agent’ı sağlam hale getirmek için hâlâ iyileştirilmesi gereken çok şey var
  • Cover-Agent akışının bir parçası olarak, kullanıcının LLM’e ek girdi veya talimat verebilmesini sağlayan özellik eklendi (--additional-instructions seçeneği)
  • Böylece geliştiriciler, Cover-Agent’ı özelleştirmek için projeye özgü ek bilgiler sağlayabiliyor
  • Örneğin bu talimatlar, anlamlı edge case’ler içeren zengin bir test seti oluşturması için Cover-Agent’ı yönlendirmekte kullanılabiliyor
  • Yapay zeka tabanlı uygulamalarda Retrieval-Augmented Generation (RAG) yaklaşımının daha yaygın hale gelmesi yönündeki genel eğilime paralel olarak, birim test üretiminde daha fazla bağlamın daha yüksek kaliteli testler ve daha yüksek başarı oranı sağladığı doğrulandı
  • Test üretim sürecini geliştirmek için, LLM’e bağlam olarak ek kütüphaneleri veya metin tabanlı tasarım belgelerini manuel eklemek isteyen kullanıcılar için --included-files seçeneği sunuldu
  • Birden çok yineleme gerektiren karmaşık kodlar, LLM için başka bir zorluk oluşturuyor
  • Başarısız olan (veya değer katmayan) testler üretildikçe, sonraki yinelemelerde aynı kabul edilmeyen testlerin tekrar tekrar önerildiği bir örüntü fark edilmeye başlandı
  • Bunu çözmek için prompt’a bir "başarısız testler" bölümü eklendi; böylece bu geri bildirim LLM’e iletiliyor, benzersiz testler üretmesi sağlanıyor ve kullanılamaz olduğu belirlenen (yani bozulan veya kapsam artışı yetersiz olan) testleri asla tekrar etmemesi isteniyor
  • Mevcut test paketini genişletirken kütüphane import’ları ekleyememek de süreç boyunca gündeme gelen başka bir sorun
  • Geliştiriciler, test üretim sürecinde bazen test framework’üne yönelik tek bir yaklaşımı kullanma konusunda dar görüşlü olabiliyor
  • Birçok farklı mocking framework’ünün yanı sıra, başka kütüphaneler de test kapsamına ulaşmaya yardımcı olabilir
  • TestGen-LLM makalesi (ve Cover-Agent), mevcut test paketini genişletmeyi hedeflediğinden tüm test sınıfını tamamen yeniden yapılandırmak kapsam dışında kalıyor
  • Bu, test üretimine kıyasla test genişletmenin bir sınırı ve gelecekteki yinelemelerde ele alınması planlanıyor
  • TestGen-LLM yaklaşımında, her test için bir sonraki test önerilmeden önce geliştiricinin manuel inceleme yapmasının gerekli olduğunu ayırt etmek önemli
  • Buna karşılık Cover-Agent, kapsam gereksinimleri karşılanana kadar (veya maksimum yinelemede durana kadar) süreç boyunca manuel müdahale olmadan mümkün olduğunca çok test üretiyor, doğruluyor ve öneriyor
  • Yapay zekayı kullanarak arka planda çalışan, geliştiricinin süreç tamamlandıktan sonra tüm test paketini tek seferde gözden geçirebildiği kesintisiz bir otomatik test üretim yaklaşımı oluşturuyor

Sonuç ve gelecek planları

  • Birçok kişi (ben dahil) TestGen-LLM makalesi ve aracı konusunda heyecanlı olsa da, bu yazıda onun sınırlamalarından bahsedildi
  • Hâlâ tamamen otomatik iş akışları yürüten bir yapay zeka ekip arkadaşı çağında değil, yapay zeka asistanı çağında olduğumuzu düşünüyoruz
  • Aynı zamanda iyi tasarlanmış bir akış, geliştiricilerin test adaylarını otomatik üretmesine ve çok daha kısa sürede kod kapsamını artırmasına yardımcı olabilir; bunu Cover-Agent içinde geliştirmeyi ve paylaşmayı planlıyoruz
  • Test üretimi alanındaki en ileri yöntemleri sürekli geliştirip Cover-Agent açık kaynak deposuna entegre etmeyi planlıyoruz
  • Test için üretken yapay zekayla ilgilenen herkesin iş birliği yapmasını ve Cover Agent’ın yeteneklerini genişletmeye yardımcı olmasını, ayrıca bu açık kaynak aracı kullanarak yeni test üretim tekniklerini keşfetmeleri için araştırmacılara ilham vermesini umuyoruz
  • GitHub’daki açık kaynak Cover-Agent deposuna bir geliştirme yol haritası eklendi; yol haritasına göre ya da kendi fikirlerinizle depoya katkı sağlandığını görmek istiyoruz
  • Cover-Agent’ın vizyonu, gelecekte tüm pre/post-pull request’ler için otomatik çalışması ve çalışan, ayrıca kod kapsamını artırdığı doğrulanmış regresyon testi iyileştirmelerini otomatik önermesi
  • Cover-Agent’ın kod tabanını otomatik tarayıp test paketiyle bir PR açtığını hayal edin
  • Sevmediğimiz işleri daha verimli yapmak için yapay zekadan yararlanalım!

Henüz yorum yok.

Henüz yorum yok.