Furkan KapukayaYazılım geliştirme
C# ve .NET2 dk okuma

.NET'te Birim Testi: xUnit ile Güvenle Değişiklik Yapmak

.NET projelerinde birim testinin faydaları, xUnit ile test yazma, Arrange-Act-Assert düzeni, sahte nesneler, test edilebilir kod tasarımı ve CI ile otomatik test çalıştırma.

Birim testi, kodunuzun küçük parçalarının beklendiği gibi çalıştığını otomatik olarak doğrulayan testlerdir. Asıl değeri, bugün yazdığınız kodu değil, altı ay sonra yapacağınız değişikliği korumasıdır.

Neden test yazmalı?

  • Bir değişikliğin başka bir yeri bozup bozmadığını saniyeler içinde gösterir.
  • Kodun nasıl kullanılacağını belgeleyen canlı örnekler sunar.
  • Hataları müşteri fark etmeden yakalar.
  • Kodu yeniden düzenlemeyi (refactoring) korkutucu olmaktan çıkarır.

xUnit ile ilk test

public class IndirimHesaplayiciTests
{
    [Fact]
    public void Bin_TL_uzeri_siparise_yuzde_on_indirim_uygulanir()
    {
        // Arrange
        var hesap = new IndirimHesaplayici();

        // Act
        var sonuc = hesap.Hesapla(1500m);

        // Assert
        Assert.Equal(1350m, sonuc);
    }

    [Theory]
    [InlineData(0, 0)]
    [InlineData(999, 999)]
    public void Esik_altinda_indirim_uygulanmaz(decimal tutar, decimal beklenen)
        => Assert.Equal(beklenen, new IndirimHesaplayici().Hesapla(tutar));
}

Arrange-Act-Assert

Her test üç bölümden oluşur: hazırlık, eylem ve doğrulama. Bu düzen testleri okunaklı tutar.

Sahte nesneler (mock)

Veritabanı, e-posta veya dış API gibi bağımlılıklar testte gerçek haliyle kullanılmaz. Arayüzler ve dependency injection sayesinde bunların yerine sahte uygulamalar verilir.

Test edilebilir kod

  • İş kuralları arayüzden (form, controller) ayrı sınıflarda olmalı.
  • DateTime.Now gibi değişken değerler doğrudan kullanılmak yerine soyutlanmalı (.NET'te TimeProvider bu iş için vardır).
  • Statik ve gizli bağımlılıklardan kaçınılmalı.

Neyi test etmeli?

  1. Para, stok ve fiyat hesapları gibi kritik iş kuralları.
  2. Sınır durumları: sıfır, negatif, boş liste, çok büyük değer.
  3. Daha önce hata çıkan yerler: her hata düzeltmesi bir testle korunmalı.

Her satırı test etmek gerekmez; risk ve değer odaklı olun.

Otomatik çalıştırma

Testler her kod gönderiminde otomatik çalışmalıdır. Bkz. GitHub Actions ile CI/CD.

Entegrasyon testleri

Birim testlerine ek olarak, gerçek veritabanı veya API ile birlikte çalışan entegrasyon testleri de yazılabilir. ASP.NET Core, uygulamayı bellekte ayağa kaldırarak test etmeye imkân tanır.

Sık sorulan sorular

xUnit mi, NUnit mi, MSTest mi?

Üçü de olgun ve yaygın. Takımın alışkın olduğu çerçeveyi seçmek en pratik yoldur.

Eski bir projeye test eklenebilir mi?

Evet. En kritik iş kurallarından ve yeni değişikliklerden başlayarak kademeli eklemek en verimli yöntemdir.

Sonuç

Testler, yazılımın güvenle büyümesini sağlayan emniyet ağıdır. Projelerinizde test altyapısı kurmak için iletişime geçebilirsiniz.