Basit bir test veri yükleyicisi nasıl oluşturulur
Yayınlanan: 2022-02-23giriş
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!
