Ana içeriğe geç
Kesit SQL
İleri · Veri Mühendisliği

SQL kodunu test etmek: veri testleri, birim testleri ve CI

Hata varsa satır döndüren test sorguları, tSQLt, pgTAP, dbt testleri, sürekli entegrasyon.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

İki tür test

Kalıp: hata varsa satır döndür

Test sorgusu, kuralı bozan satırları döndürür. Boş sonuç = test geçti. dbt, Great Expectations ve birçok veri kalite aracı bu fikirle çalışır.

-- 1) Benzersizlik: aynı order_id iki kez var mı?
SELECT order_id, COUNT(*) AS adet FROM orders GROUP BY order_id HAVING COUNT(*) > 1;
-- 2) Referans bütünlüğü: müşterisi olmayan sipariş var mı?
SELECT o.order_id FROM orders o
LEFT JOIN customers c ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL;
-- 3) Kabul edilen değerler
SELECT DISTINCT status FROM orders
WHERE status NOT IN ('delivered', 'shipped', 'cancelled', 'returned');
-- 4) Aralık ve iş kuralı: indirim 0–0,5 arasında, adet pozitif
SELECT item_id FROM order_items WHERE discount < 0 OR discount > 0.5 OR quantity <= 0;

Tek raporda tüm testler

SELECT 'siparis_tekil' AS test, COUNT(*) AS hata FROM (SELECT order_id FROM orders GROUP BY order_id HAVING COUNT(*) > 1) AS t
UNION ALL
SELECT 'siparis_musteri_var', COUNT(*) FROM orders o LEFT JOIN customers c ON c.customer_id = o.customer_id WHERE c.customer_id IS NULL
UNION ALL
SELECT 'musteri_email_bos', COUNT(*) FROM customers WHERE email IS NULL
UNION ALL
SELECT 'fiyat_maliyet_ustu', COUNT(*) FROM products WHERE price < cost;

Birim test çerçeveleri

-- SQL Server: tSQLt
EXEC tSQLt.NewTestClass 'testCiro';
GO
CREATE PROCEDURE testCiro.[test net tutar indirimi düşer]
AS
BEGIN
  EXEC tSQLt.FakeTable 'dbo.order_items';
  INSERT INTO dbo.order_items (order_id, quantity, unit_price, discount) VALUES (1, 2, 100, 0.1);
  DECLARE @sonuc DECIMAL(12,2) = dbo.fn_siparis_tutari(1);
  EXEC tSQLt.AssertEquals 180.00, @sonuc;
END;
GO
EXEC tSQLt.Run 'testCiro';

-- PostgreSQL: pgTAP
SELECT plan(2);
SELECT has_table('orders');
SELECT is((SELECT musteri_ciro(1)), 1234.50::numeric, 'Müşteri 1 cirosu');
SELECT * FROM finish();

-- dbt (schema.yml)
-- models:
--   - name: fct_siparis
--     columns:
--       - name: order_id
--         tests: [unique, not_null]
--       - name: customer_id
--         tests:
--           - relationships: {to: ref('dim_musteri'), field: customer_id}

Sürekli entegrasyon (CI)

  1. Her değişiklik (pull request) için boş bir test veritabanı oluşturulur, migration'lar uygulanır.
  2. Örnek veri yüklenir, birim ve veri testleri çalışır.
  3. SQL biçim ve stil denetimi (ör. SQLFluff) yapılır.
  4. Testler geçerse değişiklik birleştirilir ve üretime dağıtılır.
Alıştırmalara geç (5)