Birim Testi Nasıl Çalışır?
Birim testi üç temel adımda yürütülür: hazırlık (arrange), yürütme (act) ve doğrulama (assert) — bu model AAA olarak bilinir. Hazırlık aşamasında test verileri ve bağımlılıklar ayarlanır; yürütme aşamasında test edilen fonksiyon çağrılır; doğrulama aşamasında gerçek çıktının beklenen değerle eşleşip eşleşmediği kontrol edilir. Testin başarısız olması, bileşende bir hata olduğunu ya da gereksinimin değiştiğini işaret eder. Bu döngü sürekli tekrarlanarak yazılım kalitesi her commit'te güvence altına alınır.
Birim Testinin Temel Bileşenleri
- check_circle Test Senaryosu (Test Case): Belirli bir girdi-çıktı çiftini doğrulayan en küçük test birimi. Her senaryo bağımsız çalışabilmeli ve tekrarlanabilir olmalıdır.
- check_circle Assertion (Doğrulama): Gerçek çıktının beklenen değerle karşılaştırıldığı kontrol noktası. pytest'in assert ifadesi veya unittest'in assertEqual() metodu kullanılır.
- check_circle Mock Nesnesi: Veritabanı, API veya dosya sistemi gibi harici bağımlılıkların yerine geçen sahte nesne. unittest.mock.MagicMock veya pytest-mock kütüphanesi standart araçlardır.
- check_circle Test Fixture: Tekrar kullanılabilir test ortamı kurulumu. pytest'teki @pytest.fixture dekoratörü, test verilerini ve bağlantıları merkezi biçimde yönetir.
- check_circle Kod Kapsama Oranı (Coverage): Birim testlerinin kaynak kodu yüzde kaçını çalıştırdığını gösteren metrik. coverage.py veya pytest-cov ile ölçülür; %80+ üretim standardı sayılır.
ML ve AI Projelerinde Özel Zorluklar
Geleneksel yazılımın aksine ML sistemleri stokastik davranış sergiler: eğitim rastgeleliği, floating-point hassasiyet farkları ve GPU/CPU tutarsızlıkları test tekrarlanabilirliğini etkiler. Bu nedenle ML projelerinde birim testinin kapsamı modelin tahmin doğruluğunu değil; tensor şekillerini, normalleştirme çıktılarını, sınır koşullarını ve veri boru hattı dönüşümlerini hedef alır. NumPy dizisi boyutları, tokenizer çıktı uzunlukları ve embedding vektör boyutları gibi deterministik özellikler birim testi için en uygun hedeflerdir.
LLM Uygulamalarında Test Stratejileri
- check_circle API Mock'lama: OpenAI, Anthropic veya yerel model API çağrıları, önceden kaydedilmiş yanıtlar (cassette) veya MagicMock ile ikame edilir; test maliyeti ve gecikme sıfıra iner.
- check_circle RAG Bileşen Testi: Belge yükleyici, metin bölücü, embedding motoru ve vektör arama adımları ayrı birimler olarak test edilir; LangChain ve LlamaIndex yardımcı test sınıfları sağlar.
- check_circle Prompt Doğrulama: Sistem ve kullanıcı prompt'larının şema ve token limitlerine uygunluğu kural tabanlı birim testleriyle denetlenir; halüsinasyon kontrolü entegrasyon testine bırakılır.
- check_circle Çıktı Şeması Kontrolü: Structured output veya araç çağrısı (tool call) yanıtları, Pydantic modelleriyle şema doğrulaması yapılarak birim düzeyinde test edilir.
Araçlar ve Framework'ler
- check_circle pytest: Python'ın standart birim test framework'ü; fixture, parametrize ve zengin plugin ekosistemiyle AI projelerinde en yaygın kullanılan araçtır.
- check_circle unittest.mock: Python standart kütüphanesindeki mock modülü; MagicMock ve patch ile harici bağımlılıkları izole eder.
- check_circle Hypothesis: Özellik tabanlı test (property-based testing) kütüphanesi; rastgele veri üreterek edge-case'leri otomatik olarak keşfeder.
- check_circle pytest-cov / coverage.py: Kod kapsama raporlaması için endüstri standardı araçlar; CI pipeline'larında minimum kapsama eşiği zorunlu kılmak için kullanılır.
Sık Sorulan Sorular
- check_circle Birim testi ile entegrasyon testi arasındaki fark nedir?: Birim testi tek bir bileşeni izole olarak test ederken, entegrasyon testi birden fazla bileşenin birlikte çalışmasını doğrular. Gerçek LLM API çağrısını test etmek entegrasyon testidir.
- check_circle LLM çıktıları deterministik olmadığında nasıl test edilir?: Gerçek model yerine mock nesneleri kullanın ve önceden kaydedilmiş yanıtları doğrulayın. temperature=0 ve sabit seed, belirli modellerde deterministik birim testine olanak tanır.
- check_circle Birim testleri CI/CD pipeline'ına nasıl entegre edilir?: GitHub Actions veya GitLab CI YAML dosyasına "pytest --cov" adımı eklenir; kapsama eşiği karşılanmadığında build başarısız sayılır.
- check_circle Test coverage yüzdesi ne kadar olmalıdır?: Üretim kalitesindeki AI uygulamaları için %80 kapsama endüstri standardıdır. Ancak kaliteli testler, %100 kapsamalı anlamsız testlerden her zaman daha değerlidir.
- check_circle Veri ön işleme fonksiyonlarını nasıl test ederim?: Bilinen girdi-çıktı çiftleriyle parametrize test senaryoları yazın: normalleştirme, tokenizasyon ve özellik ölçekleme fonksiyonları sabit girdi-çıktı çiftleriyle doğrulanabilir.