İki tür test
- Veri testleri: Veri beklentilere uyuyor mu? (benzersiz, boş değil, geçerli değer, referans bütünlüğü, aralık)
- Kod (birim) testleri: Saklı yordam, fonksiyon veya dönüşüm sorgusu verilen girdiye doğru çıktıyı üretiyor mu?
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)
- Her değişiklik (pull request) için boş bir test veritabanı oluşturulur, migration'lar uygulanır.
- Örnek veri yüklenir, birim ve veri testleri çalışır.
- SQL biçim ve stil denetimi (ör. SQLFluff) yapılır.
- Testler geçerse değişiklik birleştirilir ve üretime dağıtılır.