Unit Testing (Birim Testi)

Yazılımın en küçük test edilebilir parçasını bağımsız doğrulayan otomatik test yöntemi; ML projelerinde veri dönüşüm ve pipeline bileşenlerini kapsayan kalite güvencesi tekniği.

Birim testi (unit test), bir yazılım sisteminin en küçük test edilebilir parçasını — genellikle tek bir fonksiyon, metot ya da sınıfı — diğer bileşenlerden bağımsız biçimde doğrulayan otomatik test yöntemidir. Her birim, belirlenmiş giriş değerleri verildiğinde beklenen çıktıyı üretip üretmediği kontrol edilerek onaylanır. Yapay zeka ve makine öğrenmesi projelerinde birim testi, geleneksel yazılımdan daha karmaşık bir hal alır: modeller deterministik değildir ve eğitim süreci rastgelelik içerir. Bu nedenle AI projelerinde birim testinin odağı modelin ağırlıklarını değil; veri ön işleme fonksiyonlarını, özellik mühendisliği adımlarını, normalleştirme dönüşümlerini ve model tahmini sarmalayıcılarını kapsayacak şekilde belirlenir. Python ekosisteminde pytest, unittest ve parametrize edilmiş testler AI projelerinin temel araçlarıdır. Harici bağımlılıklar (veritabanı, OpenAI API, Replicate) mock nesnelerle ikame edilerek testler ağ bağlantısı olmadan deterministik biçimde çalıştırılır. HuggingFace Transformers kütüphanesi, test esnasında gerçek model ağırlıklarını yüklemeden pipeline davranışını doğrulayabilen yardımcı test araçları sunar. Büyük dil modeli uygulamalarında birim testi özellikle değerlidir: RAG pipeline'larının her aşaması — belge yükleyici, metin bölücü (text splitter), gömme motoru, vektör arama ve yanıt sentezi — ayrı birimler olarak test edilebilir. LangChain ve LlamaIndex gibi framework'ler bu izolasyonu kolaylaştıran mock nesneler ve test yardımcı sınıfları sağlar. CI/CD pipeline'larına entegre edilen birim testleri, her kod değişikliğinde otomatik çalışarak regression'ları erken aşamada engeller. Test odaklı geliştirme (TDD) yaklaşımında birim testleri koddan önce yazılır; bu yöntem, AI özelliklerini geliştiren ekiplerin beklentileri netleştirmesine ve kod kalitesini artırmasına yardımcı olur. Kod kapsama oranı (test coverage), testlerin kaynak kodun ne kadarını çalıştırdığını gösterir; üretim kalitesindeki AI uygulamaları için yüzde seksen üzeri kapsama endüstri standardı olarak kabul edilir.

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.