SORU
16 NİSAN 2009, PERŞEMBE


En iyi test için SQL yolu sorguları

Bu karmaşık SQL sorgu hataları ile yaşamaya devam ediyoruz bir sorun var.

aslında yanlış posta göndererek bu sonuçlar müşteriler ve diğer sorunları böyle.

SQL sorgu oluşturma ile herkesin deneyim, aslında yeni veri yandaşları her hafta yaratıyoruz.

burada bazı düşüncelerimi ve sınırlamalar.

Test verileri - bu iken oluşturma anomaliler hariç zorlamaz hepsi doğru verileri üretimde olduğunu ispat etti. O bugün yanlış olarak düşünülebilir ama doğru 10 yıl önce olmuş olabilir bu veriler, belgelenmiş değildi ve bu nedenle biz sadece veri açıldıktan sonra haberi oldu.

Venn diyagramları ve veri haritaları - bu sorgu tasarımı test etmek için sağlam bir yol gibi görünüyor oluşturun, ancak uygulama doğru olduğunu garanti etmez. geliştiriciler önde kaydırma ve yazdıkları gibi neler olduğunu düşündürür.

Benim sorunum verebileceğiniz herhangi bir giriş için teşekkürler.

CEVAP
16 NİSAN 2009, PERŞEMBE


Fonksiyonları 200 satırlık bir uygulama yazmak olmaz. Küçük fonksiyonları içine bu uzun fonksiyonlar, açıkça tanımlanmış tek bir sorumluluk ile her ayrıştırmak istiyorum.

Neden SQL böyle yazıyorlar?

Ayrıştırmak sorguları,sizin fonksiyonları ayrıştırmak gibi. Bu onları daha kısa, daha basit, anlamak için daha kolay hale getirirdaha kolay test etmek içindaha kolay yeniden Düzenle. Ve "onların arasında," sarma "gibi etraflarında, yordam kodu." levhaları eklemek için izin verir

Bunu nasıl yaparsınız? Her önemli şey yaparak bir sorgu, bir görünüm olur. Sana o zamanoluşturdaha ilkel fonksiyonları daha karmaşık fonksiyonları oluşturma gibi daha karmaşık bu sorguları daha kolay görür.

Ve büyük bir şey, içinengörüş besteleri, tam olarak aynı performans TABLOLARINI elde edersiniz. (Bazıları için olmayacak; ne olmuş yani? Prematüre optimizasyonu tüm kötülüklerin köküdür. Kod doğrusonraeğer ihtiyacınız varsa iyileştir.)

Here's an example of using several view to decompose a complicated query.

Her görünüm, yalnızca bir dönüşüm ekler, çünkü bu örnekte, her biri bağımsız olarak hataları bulmak için test edilebilir ve testler basit.

İşte bu örnekte temel tablo:

create table month_value( 
    eid int not null, m int, y int,  v int );

Bu tablo, iki sütun, ay ve yıl, bir bilgisi, bir mutlak bir ayı temsil etmek için kullandığı için kusurlu olduğunu. İşte yeni hesaplanan sütun için özellikler:

Yapalım gibi bir doğrusal dönüşüm, bu o sıralar aynı olarak (y, m), ve böyle olduğu için herhangi bir (y,m) demet bir ve tek değeri, ve tüm değerler üst üste:

create view cm_abs_month as 
select *, y * 12   m as am from month_value;

Şimdi yapmamız gereken bu test, doğal olarak bizim spec, yani bunun için herhangi bir kayıt düzeni (y, m), bir ve tek (ben) (ben)ler üst üste. Hadi bazı testleri yazmak.

Bizim test select SQL sorgu, aşağıdaki yapıda olacaktır: test adı ve deyimi bir araya concated. bir dava Test adı Sadece rastgele bir dize. Durum bildirisi, 9 ** case when test açıklamaları.

Test ifadeleri sadece seçtiği testi geçmek için doğru olması gerekir SQL olacak.

İşte ilk testimiz:

--a select statement that catenates the test name and the case statement
select concat( 
-- the test name
'For every (y,m) there is one and only one (am): ', 
-- the case statement
   case when 
-- one or more subqueries
-- in this case, an expected value and an actual value 
-- that must be equal for the test to pass
  ( select count(distinct y, m) from month_value) 
  --expected value,
  = ( select count(distinct am) from cm_abs_month)  
  -- actual value
  -- the then and else branches of the case statement
  then 'passed' else 'failed' end
  -- close the concat function and terminate the query 
  ); 
  -- test result.

Bu sorgu sonucu çalışan: For every (y,m) there is one and only one (am): passed

Month_value, bu test işlerinde yeterli test verileri var olduğu sürece.

Yeterli test verileri için bir test de ekleyebiliriz:

select concat( 'Sufficient and sufficiently varied month_value test data: ',
   case when 
      ( select count(distinct y, m) from month_value) > 10
  and ( select count(distinct y) from month_value) > 3
  and ... more tests 
  then 'passed' else 'failed' end );

Şimdi üst üste geliyor testi:

select concat( '(am)s are consecutive: ',
case when ( select count(*) from cm_abs_month a join cm_abs_month b 
on (( a.m   1 = b.m and a.y = b.y) or (a.m = 12 and b.m = 1 and a.y   1 = b.y) )  
where a.am   1 <> b.am ) = 0 
then 'passed' else 'failed' end );

Şimdi diyelim bir dosya içine sadece sorgu olan, testlerde, koyun ve veritabanına karşı komut dosyası çalıştırın. Gerçekten de, eğer biz dükkanın görünümünü tanımlar bir script veya komut dosyaları, tavsiye ederim bir dosya başına ile ilgili görüşleri) çalıştırmak karşı veritabanına eklenir testlerimiz için, her görünüm içinaynıbu hareket, böylece komut dosyası (tekrar) bizim görünüm oluştururken, aynı zamanda görünümün testleri çalıştırır. Böylece, ikimiz de yeniden oluşturmak görünüm ve görünüm oluşturma üretimine karşı çalıştırıldığında, görünümü zaman regresyon testleri almak da üretim test edilecek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Disney Pets and Animals

    Disney Pets

    29 ŞUBAT 2012
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010