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ı sunar. 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 benimsenmektedir. Mutation testing gibi ileri teknikler ise testlerin kalitesini, yani gerçek hataları yakalama kapasitesini ölçer.

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. Her test bağımsız çalışabilmeli, harici duruma bağlı olmamalı ve saniyeler içinde tamamlanmalıdır. Başarısız bir test, hangi davranışın bozulduğunu açıkça göstermelidir.

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 / Stub: Harici bağımlılıkları (API, veritabanı, dosya sistemi) taklit eden nesneler. Testlerin deterministik ve hızlı çalışmasını, aynı zamanda ağ bağlantısından bağımsız olmasını mümkün kılar.
  • check_circle Fixture: pytest'te test öncesi ve sonrasında çalışan kurulum/temizlik kodu. Veritabanı bağlantısı, geçici dosya veya model nesnesi gibi paylaşılan kaynakları testler arasında yönetir.
  • check_circle Parametrize Test: Aynı test mantığını farklı girdi-çıktı çiftleriyle çalıştıran yapı. @pytest.mark.parametrize ile sınır koşulları, boş girdi ve uç değerler sistematik biçimde test edilir.

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 adımlarının matematiksel doğruluğunu ve veri akışı bütünlüğünü kapsar. Rastgele seed sabitlenmeli, toleranslı karşılaştırma (np.testing.assert_allclose) tercih edilmeli ve model ağırlıkları gerçek değil stub olarak kullanılmalıdır.

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ı sunar.
  • check_circle Prompt Şablonu Testi: Değişken yerleşiminin doğru çalıştığını ve gerekli alanların dolduğunu doğrulayan basit string karşılaştırma testleri; prompt injection senaryolarını da kapsar.
  • check_circle Çıktı Şema Doğrulama: LLM çıktısının beklenen JSON şemasıyla uyumluluğu Pydantic veya JSON Schema ile test edilir; yapılandırılmamış metin yerine yapılandırılmış çıktı boru hatlarında kritiktir.

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; otomatik girdi üretimi ile edge case'leri sistematik biçimde keşfeder.
  • check_circle deepeval / ragas: LLM yanıtlarının doğruluğunu, bağlamsal ilgililiğini ve halüsinasyon oranını ölçen özelleşmiş değerlendirme framework'leri.

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 Test kapsama oranı ne kadar olmalıdır? Endüstri standardı olarak üretim kalitesindeki uygulamalar için yüzde seksen üzeri kapsama hedeflenir. Ancak kapsama oranı tek başına yeterli değildir; testlerin gerçek hataları yakalama kalitesi de önemlidir.
  • check_circle TDD (Test Odaklı Geliştirme) AI projelerinde işe yarıyor mu? Veri ön işleme, özellik mühendisliği ve API sarmalayıcı gibi deterministik bileşenler için TDD çok etkilidir. Model eğitimi ve LLM çıktıları gibi stokastik bileşenler için test spesifikasyonunu önceden yazmak zordur; bu bileşenler için değerlendirme odaklı bir yaklaşım daha uygundur.