🧪 QA için SQL — Gerçek Test Senaryoları
QA için SQL — Gerçek Test Senaryoları: QA'de SQL'i, bir restoran müfettişinin mutfağa girme yetkisi gibi düşün.
QA'de SQL'i, bir restoran müfettişinin mutfağa girme yetkisi gibi düşün. Müşteri masasında yemek güzel görünüyor olabilir, garson 'her şey yolunda' diyor olabilir — müfettiş yine de arkaya geçip buzdolabının sıcaklığına bakar. UI senin masan, veritabanı ise mutfaktır: ekranda 'Ödeme başarılı ✅' yazması, `orders` tablosuna gerçekten `status='PAID'` yazıldığı anlamına gelmez. Peki UI zaten doğru mesajı gösteriyorsa, veritabanına bakmak fazladan bir titizlik değil mi? Tam tersine — en pahalı bug'lar tam olarak bu boşlukta yaşar. Ekran başarı gösterip kayıt yarım yazıldığında testin YEŞİL yanar, kullanıcı da sipariş verdiğini sanır; hata haftalar sonra muhasebe mutabakatında ortaya çıkar. UI assertion'ı 'kullanıcıya ne söylendiğini' doğrular, SQL assertion'ı 'gerçekte ne olduğunu'. İkisi ayrı sorulardır ve sadece birincisini sormak, testin kapsamını sandığından çok daha dar bırakır. Java tarafındaki karşılığı tanıdıktır: Selenium veya REST Assured ile response'u doğrularsın, ardından JDBC ile aynı kaydı veritabanından çekip `assertEquals` yaparsın. Fark şu ki HTTP response uygulamanın **iddiası**, veritabanı satırı ise **sonucu**dur. SQL bu işte iki uçta durur: testten ÖNCE INSERT/UPDATE ile bilinen bir başlangıç durumu kurarsın (böylece test rastgele production verisine bağımlı olmaz — flaky testlerin bir numaralı sebebi budur), testten SONRA SELECT ile gerçekten ne yazıldığını doğrularsın. Bir de üçüncü an vardır: bug araştırırken. 'Ara sıra kırılıyor' diyen bir raporu, `SELECT ... WHERE created_at BETWEEN ...` ile zaman aralığına oturttuğunda çoğu zaman kırılmanın deploy saatiyle çakıştığını görürsün.
Senaryo 1: Son 7 Günde Başarısız Olan Testleri Bul
Micro Lab: SQL — GROUP BY / CTE / Window
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
NOW() - INTERVAL 7 DAY Aslında Neyi Hesaplar?
NOW() çalıştırıldığı ANDA…
NOW() çalıştırıldığı ANDA sunucunun güncel tarih/saatini döndürür — sorgu her çalıştığında bu değer YENİDEN hesaplanır, sabit bir tarih DEĞİLDİR.
NOW() - INTERVAL 7 DAY bu andan…
NOW() - INTERVAL 7 DAY bu andan tam 7 gün ÖNCEKİ zaman damgasını üretir — örn. bugün 18 Temmuz'sa sonuç 11 Temmuz olur.
WHERE run_date >= ... koşulu…
WHERE run_date >= ... koşulu, bu eşik değerinden SONRAKİ (veya eşit) her satırı filtreler — 8 gün önceki bir kayıt bu sınırın DIŞINDA kalır, sonuca hiç girmez.
status = 'FAIL' koşulu AYNI WHERE'de…
status = 'FAIL' koşulu AYNI WHERE'de AND ile birleşince, veritabanı HER İKİ koşulu da sağlayan satırları arar — sıra önemli değildir, optimizer ikisini birlikte değerlendirir.
İkinci sorgudaki GROUP BY test_name…