Basit bir test veri yükleyicisi nasıl oluşturulur

Yayınlanan: 2022-02-23

giriş

SQL projeleri, test ailesi arasında çok popüler değil. Test Mühendisleri genellikle UI veya API ile çalışmayı tercih eder. Ancak iş mantığının ilişkisel veritabanlarında veya veri ambarlarında yattığı birçok proje var ve er ya da geç DB/DW üzerinde bazı testler yapmanız gerekecek.

Bu projelerde, diğerlerinde olduğu gibi, manuel test hala geçerli bir yaklaşımdır ve çoklu test veri konfigürasyonlarının hazırlanmasını gerektirir. Bu, birden fazla test verisi sql betiği, çok sayıda DB nesnesi ve DB şeması ile çalışırken acı verici olabilir. Bu yazıda size basit bir test veri yükleyicisinin nasıl oluşturulacağını göstereceğim.

Kullanıcı arayüzü

Veri deposu olarak Python ve bir SQL Server kullanacağız. Öncelikle bir masaüstü uygulaması için basit bir kullanıcı arayüzü oluşturalım. Tüm kitaplıkların zaten kurulu olduğunu varsayıyorum ve değilse, “pip install [paket]”

Ayar Penceresi

 ithalat sistemi
rastgele içe aktar
PyQt4.QtCore'dan içe aktarma pyqtSlot,SIGNAL,SLOT
PyQt4.QtGui'den içe aktarma *
PyQt4.QtCore'dan içe aktarma *
tarih saatini içe aktar

       uygulama = QApplication(sys.argv)
       w = QWidget()
       w.setWindowTitle('Test Veri Üreticisi')
       w.yeniden boyutlandırma(180, 240)
       w.setFixedSize(800, 460)

       w.setStyleSheet("arka plan rengi: beyaz;")

Kod Bloğu 1. Ayar penceresi .

Widget olarak boş bir pencereyle başlamak.

İlerleme çubuğu

Şimdi test veri yükleyicimize bir ilerleme çubuğu ekleyelim. Veri yükleme veya silme işleminin ne zaman bittiğini bize söyleyecektir. Başlangıç ​​değeri açıkça 0 olarak ayarlanmıştır.

 sınıf QProgBar(QProgressBar):

       değer = 0

   @pyqtSlot()
   def artışValue(progressBar):
           progressBar.setValue(progressBar.value)
           ilerlemeBar.değer = ilerlemeBar.değer+1

bar = QProgBar(w)
bar.yeniden boyutlandırma(320,30)
bar.setValue(0)
bar.hareket(460,400)

Kod Bloğu 2. İlerleme çubuğunu ayarlama

Kod Bloğu 2. açıklanması gereken birkaç şey içerir:

  • artışDeğeri ilerleme çubuğu değerini artıracak bir yöntem
  • QProgBar(w) QProgressBar parçacığı ilerleme çubuğunu sağlar

Etiketler

Düğmeler, açılır menüler, giriş alanları vb. için etiketlere ihtiyacımız var.

 lAd = QLabel(w)
{...}

lName.setText("Ad")
lAd.hareket(60,60)
{...}

Kod Bloğu 3. Etiketleri ayarlama

Ve Kod Bloğu 3'ün açıklaması.

  • {…} Açıkçası, tüm kodu koymayacağım, bundan sonra bu {…} kodunu “buradan kod devamı” bilgilendirmek için kullanacağım.
  • QLabel(w) -QLabel parçacığı bir metin sağlar

Düğmeler, onay kutuları ve giriş alanları

Eylem düğmelerinden başlayarak uygulamamızdaki bazı öğelerin üzerinden geçelim.

 btnDelete = QPushButton('Test Verilerini Sil', w)
btnLoad = QPushButton('Test Verilerini Yükle', w)
{...}

şema = QComboBox(w)
schema.addItem("Test Şeması")
şema.hareket(200,10)
şema.yeniden boyutlandır(120,25)

veritabanı = QLineEdit(w)
veritabanı.hareket(30, 10)
veritabanı.yeniden boyutlandırma(120,25)
database.setPlaceholderText("DB Adı")

name1 = QCheckBox('Ad 1', w)
isim1.hareket(30, 85)
name1.setKontrol Edildi(Doğru)
{...}

Kod Bloğu 4. Etiketleri ayarlama

Kod Bloğu 4'te tanımlanan uygulama öğeleri şunlardır:

  • QPushButton('') – QPushButton parçacığı bir düğme sağlar
  • QComboBox(w) – QComboBox parçacığı bir açılır listedir
  • QLineEdit(w) – QLineEdit widget'ı tek satırlık bir metin girişidir.
  • QCheckBox – QCheckBox pencere öğesi, metin etiketi içeren bir onay kutusu sağlar

Hareketler

Şimdi eğlenceli kısım geliyor. Eylemleri oluşturacağız ve sinyalleri yuvalarla bağlayacağız.

 @pyqtSlot()
def on_click_loadData():
       bar.setValue(25)
       isimListesi = []
       {...}

       db = str(veritabanı.metin())
       {...}

       if(name1.isChecked()==Doğru):
       nameList.append("Ad 1")
       {...}
       if(len(nameList)>0):
       İsim = str(nameList[randomValueGenerator(len(nameList))-1])

       bar.setValue(50)
       if(str(schema.currentText())=='Test Şeması'):
       addTestData(db, 'Test', Ad, {...})
       {...}
       bar.setValue(75)
       bar.setValue(100)

def on_click_deleteData():
       bar.setValue(25)
       db = str(veritabanı.metin())
       bar.setValue(50)
       if(str(schema.currentText())=='Test Şeması'):
       deleteTestData(db, 'Test')
       {...}
       bar.setValue(75)
       bar.setValue(100)

{...}

def randomValueGenerator(len):
       rastgele döndür.randint(1,len)

btnStructure.clicked.connect(on_click_createStructure)
btnStructure.move(20, 400)
btnStructure.resize(120,30)

btnLoad.clicked.connect(on_click_loadData)
btnLoad.move(160, 400)
btnLoad.resize(120,30)

btnDelete.clicked.connect(on_click_deleteData)
btnSil.hareket(300, 400)
btnSil.yeniden boyutlandır(120,30)

w.göster()
uygulama.exec_()

Kod Bloğu 5. Etiketleri ayarlama

Oldukça uzun bir kod parçası. Şimdi uyguladığımız şeye daha yakından bakalım:

  • on_click_loadData() - addTestData() işlevini çağırır ve kullanırız

btn.clicked.connect() işlevi

  • on_click_deleteData() - deleteTestData() işlevini çağırır ve kullanırız

btn.clicked.connect() işlevi

  • randomValueGenerator() – tanımlanan aralıktan rastgele int değeri döndürür
  • btn.clicked.connect() – sinyali yuvaya bağlarız
  • w.show() – widget'ı göster
  • app.exec_() -bir uygulamayı yürütür

veritabanı işlemleri

Uygulamamızın, düğme eylemleriyle bağlantılı SQL eylemlerine ihtiyacı var. SQL Server DB'ye bağlanmak için pyodbc bağlayıcısını kullanacağız. DB şemasının zaten mevcut olduğunu ve tablolar gibi DB nesneleri oluşturmamıza gerek olmadığını varsayıyorum.

Test verileri ekle

addTestData işlevi, kullanıcı arabiriminden değerleri alır ve bunları SQL sorgusuna iletir. Ama tüm kodu gözden geçirelim:

  • dbAddress tanımlayarak SQL Server DB'ye bağlantı açma
  • Kimlik değerini ayarlama – tablo kimliği bir otomatik artış değilse, kullanılacak bir sonraki kimliğin değerini bilmemiz gerekir
  • SQL Sorgusu tanımı. Kullanıcı arayüzünden birkaç değer ileteceğiz.
 pyodbc'yi içe aktar
ConfigParser'ı içe aktar

config = ConfigParser.RawConfigParser()
config.read('../resources/env.properties')
liste = []
giriş = 'myFancyLogin'

def addTestData(db, şema, Ad {...}):
   denemek:
      dbAddress = "Sürücü={SQL Sunucusu};Sunucu=localhost\SQLEXPRESS; 
                   Veritabanı="+db+";Trusted_Connection=yes; 
                   u;pwd="
      cnx = pyodbc.connect(dbAdresi)
      imleç = cnx.cursor()+schema+"].[adaylar] KİMLİĞE GÖRE SİPARİŞ 
            TANIM"
      id = returnValue(cnx, imleç, id)
      id = str(id + 1)

      şema = str(şema)

      testQuery = 'SELECT DB_NAME() [Mevcut Veritabanı] olarak;'
      adaylar = "INSERT INTO ["+şema+"].[adaylar]      
                    DEĞERLER("+Kimlik+",'"+Ad+"',{...}")"
      returnDBName(cnx, imleç, testQuery)

      liste = [adaylar]
      executeQuery(cnx, imleç, liste)

   e olarak pyodbc.Error hariç:
      yazdır(e)
      'addTestData işlevindeki hataları' yazdır
   başka:
      cnx.kapat()

Kod Bloğu 6. Test verisi yöntemi ekleme

Test verilerini sil

Test verilerinin silinmesi, deleteTestData(db,schema) işlevi tarafından gerçekleştirilir. Sadece 2 parametresi vardır (db,schema). Bu, içindekini taşımadan tüm tabloyu temizlemek istediğimiz anlamına gelir.

 def deleteTestData(db, şema):
   denemek:
      dbAddress = "Sürücü={SQL Sunucusu};Sunucu=localhost\SQLEXPRESS;
                   Veritabanı="+db+";Trusted_Connection=yes;
                   u;pwd="
      cnx = pyodbc.connect(dbAdresi)
      imleç = cnx.cursor()
 
      şema = str(şema)
 
      testQuery = 'SELECT DB_NAME() [Mevcut Veritabanı] olarak;'
      adaylar = "["+şema+"] DAN SİL.[adaylar]"
      adaylarProcessed = "DELETE FROM 
                             ["+şema+"].[adaylarİşlenmiş]"
 
      returnDBName(cnx, imleç, testQuery)
 
      list = [adaylar, adaylarİşlenmiş]
      executeQuery(cnx, imleç, liste)

   hariç:
      'deleteTestData işlevindeki hataları' yazdır
   başka:
      cnx.kapat()

Kod Bloğu 7. Test verilerini silme yöntemi

Araçlar

Ve addTestData() ve deleteTestData() işlevleri tarafından kullanılan bazı utils işlevleri:

 def executeQuery(cnx, imleç, liste):
   listedeki i için:
   imleç.execute(i)
   cnx.commit()

def returnDBName(cnx, imleç, dbQuery):
   imleç.execute(dbQuery)
   Değer = imleç.fetchone()
   Değer = Değer[0]
   Değer = str(Değer)

Kod Bloğu 8. Kullanım fonksiyonları

exe dosyası

Şu anda kodumuzu Python kuruluysa kullanabiliriz ve kodu derleyebiliriz, peki ya sadece çalıştırılabilir bir dosyaya sahip olmak istiyorsak? py2exe kitaplığı, Python kodundan yürütülebilir dosya oluşturmaya izin verir (Kod Bloğu 9):

 distutils.core'dan içe aktarma kurulumu
py2exe'yi içe aktar
      
setup(windows=[widget'lı dosyanın adı],
   data_files = data_files,
   seçenekler={ 'py2exe': {
      "içerir":['yudum'],
      "dll_excludes": ['MSVFW32.dll',
      'AVIFIL32.dll',
      'AVICAP32.dll',
      'ADVAPI32.dll',
      'CRYPT32.dll',
      'WLDAP32.dll',
      'MSVCP90.dll']
      }
   })

Kod Bloğu 9. .exe dosyası oluşturma

Sonuç

Ve işte çalışmamızın sonucu. Umarım öğreticiyi beğenmişsinizdir!