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.