Microsoft, birim testleri oluşturmak için çok dilli ve açık kaynaklı bir aracı olan code-testing-generator’ı duyurdu. Aracı yalnızca doğru görünen testler oluşturmakla kalmıyor; önce proje deposundan öğreniyor, ardından test edilmesi gereken kodu, kullanılan test çerçevesini, dosyaların nereye yerleştirileceğini ve derleme ile çalıştırma komutlarını belirliyor. Sonrasında testlerin deponun olağan test yolu içinde keşfedildiğini doğruluyor.
Aracı, dotnet/skills deposundaki dotnet-test eklentisi kapsamında kullanılabiliyor. Test edilen kodu izole ediyor ve harici hizmetler ile diğer bağımlılıklar için sahte nesneler oluşturuyor. Mevcut kapsamına entegrasyon testleri, uçtan uca testler, tarayıcı testleri veya performans testleri dahil değil.
Testleri yazmadan önce depoyu anlayarak başlıyor
Aracı doğrudan kod oluşturmaya başlamak yerine test edilmesi gereken bölümü arıyor, dili ve test çerçevesini tanıyor, yeni testlerin nereye yerleştirileceğini ve nasıl yazılacağını anlamak için mevcut testleri inceliyor. Ayrıca derleme ve testleri çalıştırma komutlarını belirliyor.
Bu yaklaşım, yeni bir test projesinin tek başına derlenip çalıştırıldığında başarılı olduğu, ancak çözüme veya sürekli entegrasyon ortamının kullandığı test komutuna dahil edilmediği durumların önlenmesine yardımcı oluyor. Bu nedenle aracı, deponun testleri nasıl keşfettiğini inceliyor ve yeni testlerin bu keşif kapsamında görünmesini sağlıyor.
Aracı, çalışma düzeyini isteğin boyutuna göre seçiyor:
- Doğrudan: İlgili kodu okur, testleri yazar ve sonucu doğrular.
- Tek geçiş: Bir kez araştırma ve planlama yapar, ardından planı uygular.
- Yinelemeli: Büyük bir isteği kapsamak veya belirli bir kapsam hedefe ulaşmak için araştırma, planlama ve uygulama döngüsünü yineler.
Yalnızca başarılı olup olmadıklarını değil, testlerin yararlılığını da doğruluyor
Daha büyük görevlerde aracı, test edilmesi gereken kodu listeliyor ve daha fazla bağımlılığa sahip koda geçmeden önce daha basit bölümlerle başlıyor. Ayrıca her davranışı bir test dosyasıyla ilişkilendiriyor, projenin yerel kurallarına uyuyor ve çalışma sırasında testleri çalıştırıyor.
Oluşturulan kod derlenmezse aracı onu düzeltiyor; iddialardan biri doğru değilse kaynağa dönerek testi düzeltiyor. Testleri oluştururken üretim kodunu değiştirmiyor; ayrıca harici adresleri çağıran, bağlantı noktaları açan veya kesin zamanlamaya dayanan birim testlerinden kaçınıyor.
Aracı, tamamlamadan önce testlerin başarısız olması gerektiği varsayılan küçük değişiklikleri içeren ve basitleştirilmiş bir mutasyon testi biçimi oluşturan bir dizi kontrol gerçekleştiriyor. Ayrıca zayıf veya eksik iddiaları arıyor ve gerekli her senaryo için bir test bulunduğundan emin oluyor. Bunun yanında çalışma alanının tamamını derliyor, tüm test kümesini çalıştırıyor ve depodaki test komutunun yeni testleri bulabildiğini doğruluyor.
Dahili test sonuçları
En son dahili karşılaştırmalı testte aracı, 152 görevin 140’ını tamamlayarak %92,1 oranına ulaştı. Aynı modeli kullanan standart Copilot ise 120 görevi ve %78,9 oranını elde etti. Microsoft, başarısızlık durumlarının %63 azaldığını belirtti.
En büyük farklar, kararların çoğunu aracıya bırakan belirsiz isteklerde ortaya çıktı. Uzmanlaşmış aracı 89 görevin 79’unda başarılı olurken standart Copilot 59 görevde başarılı oldu; başarısızlıklar 30’dan 10’a düştü. Ayrıntılı isteklerde ise sonuçlar birbirine yakındı; aracı 63 görevin 61’inde başarılı oldu.
Belirli bir kod değişikliği için test yazılmasını isteyen 15 görevin tamamında aracı başarılı olurken standart Copilot bunların hiçbirinde başarılı olamadı. Ortak sonuçlar açısından iki sistem 119 görevde başarılı oldu; yalnızca uzmanlaşmış aracı 21 görevde, yalnızca standart Copilot ise bir görevde başarılı oldu ve iki sistem de 11 görevde başarısız oldu.
Aracı, standart Copilot’un 7.129 testine karşılık 6.963 test oluşturdu. Nihai satır kapsamı ortalaması sırasıyla %72,4 ve %72,2, dal kapsamı ortalaması ise %49,8 ve %49,1 oldu. Görev başına ortalama süre uzmanlaşmış aracı için 359 saniye, standart Copilot için 380 saniyeydi. Microsoft, kazanımın daha fazla test üretmekten değil, güvenilirlikten kaynaklandığını söylüyor.
Birden fazla dil desteği ve eklentinin kullanılabilirliği
Ekteki yönergeler .NET, Python, TypeScript, JavaScript, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell ve C++ desteği içeriyor. Testler, aracının tüm projelere C# kalıplarını uygulamak yerine her deponun kurallarını öğrendiğini gösterdi.
SWE Atlas karşılaştırmasının 44 görevi üzerinde gerçekleştirilen başka bir testte aracı 16 görevi tamamlayarak %36,4 oranına ulaştı. Standart Copilot ise 12 görevi ve %27,3 oranını elde etti. Oluşturulan testler ayrıca 550 durumu geçti ve enjekte edilen 360 hatayı yakalayabildi; standart sistemde bu sayılar sırasıyla 493 ve 316 oldu. Microsoft, bu karşılaştırmanın daha zor olduğunu ve tamamlama oranlarının çok daha düşük kaldığını kabul ediyor.
Eklenti GitHub Copilot CLI’da kullanılabiliyor. Ayrıca hâlâ önizleme aşamasında olan eklenti desteği aracılığıyla Visual Studio Code ve VS Code Insiders’ta da kullanılabiliyor. Microsoft, Visual Studio desteği üzerinde de çalışıyor. Eklentiyi GitHub Copilot CLI’a yüklemek için kullanıcı, /plugin marketplace add dotnet/skills komutuyla eklenti pazarını ekler; ardından /plugin install dotnet-test@dotnet-agent-skills komutuyla eklentiyi yükler, CLI’ı yeniden başlatır ve code-testing-generator aracısını seçer.