Ünite 6 / 12

Test Otomasyonu ve Kalite Güvence

Kazanimlar:

  • Birim, entegrasyon ve uç durum testlerini AI ile anlamlı doğrulama (assert) içerecek biçimde üretebilme
  • Test kapsamı, sınır değerleri ve olumsuz senaryoları AI desteğiyle sistematik olarak çıkarabilme
  • AI'ın ürettiği testlerin gerçekten davranış doğruladığını, sadece mevcut kodu tekrarlamadığını denetleyebilme

Test, yazılımın gerçekten söz verdiği gibi davrandığını kanıtlayan mekanizmadır. İyi bir test paketi, bir değişikliğin bir şeyi bozup bozmadığını saniyeler içinde söyler ve mühendise güvenle hareket etme özgürlüğü verir. AI, test yazmanın en sıkıcı ve en çok atlanan kısmını hızlandırır: çok sayıda senaryo, sınır değeri ve olumsuz durum üretir. Ama burada sinsi bir tuzak vardır: AI, kodun olması gereken davranışını değil, mevcut (belki hatalı) davranışını doğrulayan testler yazabilir; ya da hiçbir şeyi gerçekten kontrol etmeyen, her zaman geçen boş testler üretebilir. Bir testin değeri, geçmesinde değil, doğru şeyi kontrol etmesinde ve yanlışta kırmızıya dönmesindedir.

Bu ünitede birim, entegrasyon ve uç durum testlerini anlamlı doğrulamalarla (assert) nasıl ürettireceğinizi; test kapsamını, sınır değerlerini ve olumsuz senaryoları nasıl sistematik çıkaracağınızı; ve AI'ın ürettiği testlerin gerçekten davranış doğruladığını nasıl denetleyeceğinizi göreceğiz.

Kavramlar: Birim testi (unit test): Tek bir fonksiyon/sınıfı izole olarak test eder. Entegrasyon testi: Birden çok parçanın birlikte doğru çalıştığını test eder. Assert (doğrulama): Bir sonucun beklenene eşit olduğunu kontrol eden ifade; testin kalbi budur. Kapsam (coverage): Kodun ne kadarının testlerce çalıştırıldığı; yüksek kapsam kaliteyi garanti etmez.

Anlamlı Testler Ürettirmek

İyi bir test üç şeyi net yapar: bir durum kurar (arrange), bir eylem yapar (act), sonucu doğrular (assert). AI'a test yazdırırken hangi davranışı doğrulamak istediğinizi ve hangi senaryoları kapsaması gerektiğini belirtin; yoksa yüzeysel, hep geçen testler üretir.

  1. Test edilecek davranışı tanımlayın. "Ne doğru sayılır?" sorusunu net yanıtlayın.
  2. Senaryo türlerini isteyin. Normal, sınır, olumsuz, hata durumu.
  3. Anlamlı assert dayatın. Sadece "hata fırlatmadı" değil, "doğru değeri döndü".
  4. Testin doğruluğunu denetleyin. Kodu bilinçli bozunca test kırmızıya dönüyor mu?

Kapsamlı test üretme promptu:"Aşağıdaki 'indirimUygula(tutar, kupon)' fonksiyonu için birim testleri yaz.Şu kategorilerde EN AZ birer senaryo olsun: (1) normal geçerli kupon,(2) sınır değerler (0 tutar, %100 indirim), (3) olumsuz (geçersiz kupon,negatif tutar), (4) hata durumu (null kupon). Her testte SOMUT beklenendeğeri assert et (sadece 'çalıştı' değil). Testleri okunur adlandır. Kod: [kod]"

Sınır değer çıkarma promptu:"Bu fonksiyonun girdileri için sınır değer analizi yap. Her parametre için'tam sınırda', 'sınırın hemen altında', 'sınırın hemen üstünde' değerlerinitablo olarak çıkar. Sonra bu sınırları kapsayan test senaryolarını listele.Henüz kod yazma, sadece analiz ve senaryo listesi. Fonksiyon: [imza]"

Dikkat: Yüksek test kapsamı (ör. %90) kodun doğru olduğunu kanıtlamaz. Kapsam, kaç satırın çalıştırıldığını ölçer; o satırların doğru sonucu ürettiğini değil. Anlamlı assert içermeyen bir test, kapsamı yükseltir ama hiçbir şey garanti etmez. Kaliteyi assert'in içeriği belirler, sayısı değil.

Testin Kendisini Test Etmek: Mutasyon Mantığı

AI'ın ürettiği testin gerçekten işe yaradığını anlamanın en pratik yolu, kodu bilinçli olarak bozmaktır (mutasyon testi mantığı). Bir koşulu tersine çevirin, bir + işaretini - yapın; eğer hiçbir test kırmızıya dönmüyorsa, testleriniz o davranışı aslında korumuyor demektir.

Test zayıflığı avı promptu:"Aşağıdaki testlerin bu koddaki hangi olası hataları YAKALAYAMAYACAĞINIsöyle. Koda yapılabilecek 5 küçük bozma (mutasyon) öner (ör. > yerine >=,+ yerine -) ve her biri için mevcut testlerin bunu yakalayıp yakalamayacağınıbelirt. Yakalanmayanlar için eklenmesi gereken testi öner. Kod: [kod] Testler: [test]"

Zayıf Prompt / Güçlü Prompt

ZAYIF:"Bu fonksiyona test yaz."(Sonuç: genellikle tek bir mutlu senaryo, zayıf assert; hataları kaçırır.)GÜÇLÜ:"Bu 'sifreGucluMu(sifre)' fonksiyonuna test yaz. Kural: en az 8 karakter,1 büyük harf, 1 rakam gerekli. Şu senaryoları AYRI testler olarak kapsa:tam 8 karakter (sınır), 7 karakter (sınır altı), büyük harf yok, rakam yok,boş string, sadece boşluk, çok uzun (1000 karakter). Her testte beklenentrue/false değerini açıkça assert et ve testi ne kontrol ettiğine göre adlandır."

Güçlü prompt, kuralları ve tam sınır senaryolarını verir. "Tam 8 / 7 karakter" gibi sınır çiftleri, en sık hata yapılan yerlerdir (> ile >= karışması). Zayıf prompt bu sınırları atlar ve hatayı üretime taşır.

Test Türleri ve Nerede Kullanılır

Test türü

Neyi doğrular

AI'ın katkısı

Dikkat

Birim

Tek fonksiyon/sınıf

Çok senaryo hızlı üretir

Anlamlı assert şart

Entegrasyon

Parçaların birlikte çalışması

Senaryo ve sahte veri (mock) taslağı

Gerçek bağımlılık davranışı

Uç/kabul

Kullanıcı akışının tümü

Adım listesi ve beklenti

Kırılgan olmaya meyilli

Regresyon

Eski hatanın dönmemesi

Hataya özel test

Her düzeltmeye eklenmeli

Mini Vakalar

Vaka 1 — Hep geçen test. AI, bir fonksiyona 12 test yazar ve hepsi geçer. Mühendis şüphelenip fonksiyonun dönüş değerini bilinçli olarak bozar; testlerin yalnızca 3'ü kırmızıya döner. Diğer 9 test anlamlı assert içermiyordur. Mutasyon avıyla testler güçlendirilir; gerçek koruma 9 senaryoda kazanılır.

Vaka 2 — Sınır hatası. Bir yaş doğrulama fonksiyonu "18 ve üstü geçerli" olmalıdır ama > 18 yazılmıştır, yani 18 yaş reddedilir. AI, sınır değer analiziyle "tam 18" senaryosunu ürettiği için hata testte anında çıkar. Tek bir sınır testi, gerçek bir kullanıcı şikâyetini önler.

Vaka 3 — Mevcut davranışı sabitleme. AI'a "bu koda göre test yaz" denince, kodda zaten var olan bir yuvarlama hatasını "doğru" kabul eden bir test üretir. Mühendis, testi koda değil gereksinime (beklenen doğru değere) göre yazdırınca test kırmızıya döner ve asıl hata ortaya çıkar. Testler koddan değil, beklentiden türetilmelidir.

Sık yapılan hatalar

  • Anlamsız assert. "Hata fırlatmadı" yeterli değil; doğru değer doğrulanmalı.
  • Kapsamı kaliteyle karıştırmak. Yüksek kapsam, doğru sonuç garantisi değildir.
  • Testi koda göre yazdırmak. Mevcut hatayı "doğru" olarak sabitler; testler beklentiden türemeli.
  • Sınır değerleri atlamak. > ile >= karışması en sık hatadır; sınır çiftleri test edilmeli.
  • Testin kendisini denetlememek. Kodu bozunca kırmızıya dönmeyen test, koruma sağlamıyordur.

Özetle

İyi test paketi güvenle değişim yapmanın anahtarıdır. AI, çok sayıda senaryoyu, sınır değerini ve olumsuz durumu hızlı üretir; ama testleri gereksinimden değil koddan türetirse mevcut hataları sabitleyebilir veya anlamsız, hep geçen testler yazabilir. Her testte somut beklenen değeri assert edin, sınır çiftlerini kapsayın ve kodu bilinçli bozarak testlerinizin gerçekten koruduğunu doğrulayın. Kapsam sayısı değil, assert'in içeriği kaliteyi belirler.

Uygulama görevi

Bir fonksiyon seçin ve kapsamlı test üretme promptuyla dört kategoride (normal, sınır, olumsuz, hata) testler ürettirin; her testte somut beklenen değeri assert ettirin. Sonra test zayıflığı avı promptunu uygulayıp kodda 5 küçük mutasyon önertin ve testlerin hangilerini yakaladığını çalıştırarak kontrol edin. Yakalanmayan en az bir mutasyon için yeni test ekleyip artık kırmızıya döndüğünü gösterin.

Kontrol listesi

  • [ ] Testleri koda değil, beklenen/doğru davranışa göre yazdırdım.
  • [ ] Normal, sınır, olumsuz ve hata senaryolarını kapsadım.
  • [ ] Her testte somut beklenen değeri assert ettim.
  • [ ] Sınır çiftlerini (tam sınır / hemen altı-üstü) test ettim.
  • [ ] Kodu bilinçli bozarak testlerin kırmızıya döndüğünü doğruladım.
  • [ ] Yakalanmayan mutasyonlar için yeni test ekledim.