Projeler

VS2026 Unit Test Generator

Mevcut bir .NET projesindeki servis metodlarını Roslyn ile analiz edip, bağımlılıkları ve veri modelleriyle birlikte eksiksiz bir test bağlamı çıkaran; bunu Copilot Chat'e devrederek xUnit birim testlerini yüksek coverage hedefiyle ürettiren bir Visual Studio 2026 eklentisi.

C#RoslynxUnitGitHub CopilotVisual Studio SDKVSIX.NET 8

Projenin Amacı

Var olan bir kod tabanına sonradan birim test yazmak, çoğu ekibin sürekli ertelediği iştir. Zor olan kısım testin kendisi değildir — testin ihtiyaç duyduğu bağlamı toplamaktır. Bir servis metoduna test yazacaksanız, o metodu okumanız yetmez: çağırdığı private metodları, enjekte edilen bağımlılıkları, dönüş tipini oluşturan DTO'ları ve arkadaki entity'leri de bilmeniz gerekir. Bu toplama işi elle yapıldığında dakikalar alır ve her metot için tekrarlanır.

VS2026 Unit Test Generator tam olarak o toplama işini devralır. Amacı, mevcut bir projedeki servislerin xUnit birim testlerini, kod kapsama (coverage) oranını mümkün olan en yüksek değere çekecek şekilde ürettirmektir.

💡

Eklenti ek bir mock kütüphanesine yaslanmaz; üretilen testler tamamen xUnit üzerine kuruludur.

Nasıl Çalışıyor?

Akış dört adımdan oluşuyor:

1. Çoklu Seçim

Eklenti penceresinden iki taraflı bir seçim yaparsınız:

  • Hangi servis metodları test edilecek (çoklu seçim)
  • Hangi test service class'larına yazılacak (çoklu seçim)

Böylece tek bir çalıştırmada birden fazla metodu, birden fazla test sınıfına dağıtarak işleyebilirsiniz.

2. Roslyn ile Bağlam Çıkarımı

Seçim yapıldıktan sonra eklenti, Roslyn üzerinden kod tabanını semantik olarak tarar ve teste gereken her şeyi çıkarır:

ToplananNeden gerekli
Public metod gövdesiTest edilecek asıl davranış
Çağrılan private metodlarDallanmaları görmeden coverage hedeflenemez
Bağımlılıklar (interface'ler)Test kurulumunda karşılanacak yüzeyin tam imzası
Entity'lerVeri modelinin gerçek şekli
DTO'larGirdi/çıktı sözleşmeleri

Bu tarama metin araması değil, derleyici seviyesinde bir sembol çözümlemesidir — yani "hangi metot gerçekten neyi çağırıyor" sorusunun kesin cevabıdır.

3. Budama: %60 Bağlam Kârı

Toplanan bağlam ham hâliyle Copilot'a gönderilmez. Roslyn'in sunduğu sözdizim ağacı üzerinde bir budama adımı çalışır: yorum satırları ve test üretimine katkısı olmayan kod parçaları ayıklanır.

Bu adım bağlamda yaklaşık %60 tasarruf sağlar. Kazanç iki yönlüdür: daha az token harcanır ve modelin dikkati gürültüye değil, yalnızca teste konu olan koda yönelir.

4. Clipboard → Copilot Chat

Budanmış bağlam paketi Clipboard'a alınır. Yapmanız gereken tek şey, Visual Studio içindeki Copilot Chat penceresine yapıştırıp Enter'a basmaktır.

Paketin başında UnitTestWriter.agent.md promptu yer alır. Bu prompt modelin serbest yorum yapmasını engelleyen bir kurallar sözleşmesidir: kullanılacak test framework'ü, isimlendirme düzeni, Arrange/Act/Assert yapısı, bağımlılıkların nasıl karşılanacağı ve üretilecek test metodu sayısı buradan dayatılır.

Clipboard içeriği
├── UnitTestWriter.agent.md      → framework kuralları ve üretim talimatı
├── Hedef servis metodu           → test edilecek davranış
├── Çağrılan private metodlar     → dallanma haritası
├── Bağımlılık arayüzleri         → karşılanacak imzalar
└── Entity + DTO tanımları        → veri sözleşmeleri

Sonuç: seçtiğiniz sayıda, framework kurallarına tam uyumlu ve mümkün olan en yüksek kapsamayı hedefleyen birim test metodları.

Neden Ucuz Modelle de Çalışıyor?

Projenin en dikkat çekici tarafı bu. Copilot'ta model seçimi Auto olarak bıraksanız bile — yani testler en ucuz yoldan yazdırılsa bile — çıktı yüksek doğrulukta oluyor.

Sebebi basit: modele tahmin edecek bir şey bırakılmıyor.

Normal şartlarda bir dil modelinden test istediğinizde, model bağımlılıkların ne döndürdüğünü, DTO'nun hangi alanlara sahip olduğunu ve private metodun hangi koşulda hangi dala girdiğini tahmin etmek zorunda kalır. Tahmin ettiği her şey hata payıdır ve bu payı kapatmanın yolu genelde daha güçlü (ve daha pahalı) bir modele geçmektir.

Burada ise bu bilgilerin tamamı bağlamda determinist olarak zaten mevcut. Roslyn'in çıkardığı sembol bilgisi kesindir, yoruma açık değildir. Geriye modele kalan iş, elindeki net veriyi kurallı bir test metoduna dönüştürmektir — bu da küçük modellerin rahatlıkla başardığı bir görevdir.

💡

Çıkarılan ders: üretilen kodun kalitesini belirleyen şey modelin zekâsından çok, ona verilen bağlamın eksiksizliği ve determinizmidir. Bağlamı doğru kurduğunuzda pahalı modele ihtiyaç kalmıyor.

Teknik Yığın

  • Roslyn (.NET Compiler Platform): Semantik model üzerinden sembol çözümleme, çağrı grafiği çıkarımı ve sözdizim ağacı budama
  • Visual Studio 2026 Extensibility Model (VisX): Tool window, çoklu seçim arayüzü ve komut entegrasyonları
  • VSIX Package: Eklenti manifest'i ve dağıtım paketi
  • .NET 8: Eklenti çalışma zamanı
  • xUnit: Üretilen testlerin hedef framework'ü
  • GitHub Copilot Chat: Üretim katmanı (agent prompt ile yönlendirilir)

Kullanım Senaryoları

SenaryoAçıklama
Brownfield projelerYıllardır testsiz ilerlemiş bir kod tabanına toplu hâlde coverage kazandırmak
Coverage eşiğiCI/CD hattındaki minimum kapsama şartını karşılamakta zorlanan servisleri hızla eşiğin üstüne çıkarmak
Standart dayatmaUnitTestWriter.agent.md sayesinde ekipteki herkesin aynı test yazım düzenine uymasını sağlamak
Maliyet kontrolüUcuz model ayarıyla çalışarak kurumsal AI kotasını verimli kullanmak

Sonuç

VS2026 Unit Test Generator, "yapay zekâ bizim yerimize test yazsın" fikrinden çok, "yapay zekâya doğru soruyu doğru bağlamla soralım" fikrinin bir uygulaması. Roslyn'in kesinliğiyle Copilot'un üretkenliğini birleştirince, ortaya hem hızlı hem de tekrarlanabilir bir test üretim hattı çıkıyor.

En sevdiğim tarafı ise ekonomik olanı: bağlamı %60 budayıp doğru kurguladığınızda, en ucuz model ayarıyla bile ciddi coverage değerlerine ulaşabiliyorsunuz.

0

Yorumlar

İlk yorumu siz yapın

Düşüncelerinizi Paylaşın

Henüz yorum yapılmamış. İlk yorumu yukarıdaki formdan siz yapın!
ME

Muhammed Emin Özdemir

Kurumsal sistemlerde uzmanlaşmış Senior Software Developer. Temiz kod, ölçeklenebilir mimariler ve modern UI/UX üzerine odaklanıyor.

Hakkımda daha fazlası →