Yazılım Testi Neden Vazgeçilmezdir?
Kaliteli yazılım, kapsamlı test stratejileri ile mümkündür. Test edilmemiş kod, çalışan ama güvenilmeyen koddur. BUZ Yazılım olarak 2007'den bu yana 100'den fazla projede test odaklı geliştirme yaklaşımını benimsiyoruz. Bu yazıda, etkili test stratejilerini ve en iyi uygulamaları paylaşıyoruz.
Test Piramidi
Test piramidi, farklı test türlerinin ideal dağılımını gösteren bir modeldir.
Piramidin Katmanları (Alttan Üste)
- Unit Testler (Taban - En çok): Hızlı, izole, çok sayıda
- Integration Testler (Orta): Bileşenler arası etkileşim
- E2E Testler (Tepe - En az): Uçtan uca kullanıcı senaryoları
Bu dağılım, hız, maliyet ve güvenilirlik arasındaki dengeyi optimize eder.
Unit Test (Birim Test)
Unit testler, kodun en küçük birimlerini (metotlar, fonksiyonlar) izole şekilde test eder.
Unit Test Özellikleri
- Hızlı: Milisaniyeler içinde çalışmalı
- İzole: Dış bağımlılıklardan bağımsız
- Tekrarlanabilir: Her çalıştırmada aynı sonucu vermeli
- Kendi kendini doğrulayan: Otomatik başarı/başarısızlık kararı
Unit Test Örneği (C# - xUnit)
public class PriceCalculatorTests
{
[Fact]
public void CalculateDiscount_WhenQuantityAbove10_Returns10PercentDiscount()
{
var calculator = new PriceCalculator();
var result = calculator.CalculateDiscount(100m, 15);
Assert.Equal(90m, result);
}
[Theory]
[InlineData(100, 5, 100)]
[InlineData(100, 10, 100)]
[InlineData(100, 11, 90)]
public void CalculateDiscount_VariousQuantities_ReturnsExpected(
decimal price, int quantity, decimal expected)
{
var calculator = new PriceCalculator();
Assert.Equal(expected, calculator.CalculateDiscount(price, quantity));
}
}
Mock ve Stub Kullanımı
Dış bağımlılıkları izole etmek için mock nesneler kullanılır:
- Moq: .NET için popüler mocking framework'ü
- NSubstitute: Kolay sözdizimi ile alternatif
- FakeItEasy: Sezgisel API sunan seçenek
Integration Test (Entegrasyon Testi)
Integration testler, birden fazla bileşenin birlikte çalışmasını doğrular.
Test Edilecek Entegrasyonlar
- Veritabanı erişimi: Repository katmanı ve ORM
- API çağrıları: REST/GraphQL endpoint'leri
- Mesaj kuyrukları: Asenkron iletişim
- Dosya sistemi: Dosya okuma/yazma işlemleri
- Harici servisler: Ödeme, e-posta, SMS
ASP.NET Core Integration Test
public class ProductApiTests : IClassFixture<WebApplicationFactory<Program>>
{
private readonly HttpClient _client;
public ProductApiTests(WebApplicationFactory<Program> factory)
{
_client = factory.CreateClient();
}
[Fact]
public async Task GetProducts_ReturnsSuccessStatusCode()
{
var response = await _client.GetAsync("/api/products");
response.EnsureSuccessStatusCode();
}
}
E2E Test (Uçtan Uca Test)
E2E testler, gerçek kullanıcı senaryolarını baştan sona simüle eder.
E2E Test Araçları
- Playwright: Microsoft'un modern E2E test aracı, çoklu tarayıcı desteği
- Cypress: JavaScript ekosisteminde popüler
- Selenium: En yaygın ve olgun araç
- Puppeteer: Chrome/Chromium odaklı
E2E Test Senaryosu Örneği
- Kullanıcı siteye giriş yapar
- Ürün listesini görüntüler
- Bir ürünü sepete ekler
- Ödeme sayfasına geçer
- Siparişi tamamlar
- Onay e-postası alır
TDD (Test Driven Development)
Test Güdümlü Geliştirme, testi koddan önce yazma yaklaşımıdır.
TDD Döngüsü (Red-Green-Refactor)
- Red: Başarısız olan bir test yazın
- Green: Testi geçecek minimum kodu yazın
- Refactor: Kodu temizleyin ve iyileştirin
- Tekrar: Bir sonraki özellik için döngüyü tekrarlayın
TDD Avantajları
- Daha temiz ve modüler kod
- Gereksinim odaklı geliştirme
- Kapsamlı regresyon testi güvencesi
- Daha iyi tasarım kararları
Test Kapsamı (Code Coverage)
Test kapsamı, kodun ne kadarının testlerle kapsandığını ölçer.
- %80+ genellikle iyi bir hedef olarak kabul edilir
- %100 hedeflemek pratik olmayabilir ve kırılgan testlere yol açabilir
- Kritik iş mantığı %100 kapsanmalıdır
- Kapsam aracı olarak Coverlet (.NET) veya Istanbul (JS) kullanılabilir
Sonuç
Etkili test stratejileri, yazılım kalitesinin sigortasıdır. BUZ Yazılım olarak projelerimizde test piramidi yaklaşımını benimseyerek müşterilerimize güvenilir çözümler sunuyoruz.
Projelerinizde test stratejisi oluşturmak için bizimle iletişime geçin.