Cum să construiți un încărcător simplu de date de testare
Publicat: 2022-02-23Introducere
Proiectele SQL nu sunt foarte populare în familia de testare. Inginerii de testare preferă de obicei să lucreze cu UI sau API. Dar există o mulțime de proiecte în care logica de afaceri se află în baze de date relaționale sau depozite de date și mai devreme sau mai târziu va trebui să faceți niște teste pe DB/DW.
În acele proiecte, la fel ca și în altele, testarea manuală este încă o abordare valabilă și necesită pregătirea mai multor configurații de date de testare. Acest lucru poate fi dureros atunci când lucrați cu mai multe scripturi SQL de date de testare, o mulțime de obiecte DB și scheme DB. În acest articol, vă voi arăta cum să construiți un încărcător simplu de date de testare.
Interfața cu utilizatorul
Vom folosi Python și un server SQL ca stocare de date. În primul rând, să construim o interfață simplă pentru o aplicație desktop. Presupun că toate bibliotecile sunt deja instalate, iar dacă nu, atunci „pip install [pachet]”
Fereastra de setare
import sys import aleatoriu din PyQt4.QtCore import pyqtSlot,SIGNAL,SLOT din importul PyQt4.QtGui * din importul PyQt4.QtCore * import datetime app = QApplication(sys.argv) w = QWidget() w.setWindowTitle('Generatorul de date de testare') w.redimensionare(180, 240) w.setFixedSize(800, 460) w.setStyleSheet("culoarea fundalului: alb;")
Bloc de cod 1. Fereastra de setare .
Începând cu o fereastră goală ca widget.
Bara de progres
Acum să adăugăm o bară de progres la încărcătorul nostru de date de testare. Ne va spune când încărcarea sau ștergerea datelor sa încheiat. Valoarea inițială este evident setată la 0.
clasa QProgBar(QProgressBar): valoare = 0 @pyqtSlot() def increaseValue(progressBar): progressBar.setValue(progressBar.value) progressBar.value = progresBar.valoare+1 bară = QProgBar(w) bar.resize(320,30) bar.setValue(0) bar.move(460.400)
Bloc de cod 2. Setarea barei de progres
Blocul de cod 2. conține câteva lucruri care trebuie explicate:
- cresteValoarea – o metodă care va crește valoarea barei de progres
- QProgBar(w) – Widgetul QProgressBar oferă bara de progres
Etichete
Avem nevoie de etichete pentru butoane, meniuri derulante, câmpuri de introducere etc.
lNume = QLabel(w) {...} lName.setText(„Nume”) lName.move(60,60) {...}
Blocul de cod 3. Setarea etichetelor
Și explicația Blocului de cod 3.
- {…} – Evident, nu voi pune tot codul, așa că de acum încolo voi folosi acest {…} pentru a informa „continuarea codului aici”.
- QLabel(w) - Widgetul QLabel oferă un text
Butoane, casete de selectare și câmpuri de introducere
Să trecem prin mai multe elemente din aplicația noastră, începând cu butoanele de acțiune.
btnDelete = QPushButton('Ștergeți datele de testare', w) btnLoad = QPushButton('Încărcare date de testare', w) {...} schema = QComboBox(w) schema.addItem(„Schema de testare”) schema.move(200,10) schema.resize(120,25) baza de date = QLineEdit(w) database.move(30, 10) database.resize(120,25) database.setPlaceholderText(„Nume DB”) name1 = QCheckBox('Nume 1', w) nume1.mutare(30, 85) name1.setChecked(Adevărat) {...}
Blocul de cod 4. Setarea etichetelor
Elementele aplicației definite în Blocul de cod 4 sunt:
- QPushButton('') – Widgetul QPushButton oferă un buton
- QComboBox(w) – Widgetul QComboBox este o listă derulantă
- QLineEdit(w) – Widgetul QLineEdit este o intrare de text pe o linie.
- QCheckBox – Widgetul QCheckBox oferă o casetă de selectare cu o etichetă text
Acțiuni
Acum vine partea distractivă. Vom crea acțiunile și vom conecta semnalele cu sloturi.
@pyqtSlot() def on_click_loadData(): bar.setValue(25) nameList = [] {...} db = str(database.text()) {...} if(name1.isChecked()==True): nameList.append(„Nume 1”) {...} if(len(nameList)>0): Nume = str(nameList[randomValueGenerator(len(nameList))-1]) bar.setValue(50) if(str(schema.currentText())=='Schema de testare'): addTestData(db, „Test”, Nume, {...}) {...} bar.setValue(75) bar.setValue(100) def on_click_deleteData(): bar.setValue(25) db = str(database.text()) bar.setValue(50) if(str(schema.currentText())=='Schema de testare'): deleteTestData(db, „Test”) {...} bar.setValue(75) bar.setValue(100) {...} def randomValueGenerator(len): returnează random.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) btnDelete.move(300, 400) btnDelete.resize(120,30) w.show() app.exec_()
Blocul de cod 5. Setarea etichetelor

Este o bucată de cod destul de lungă. Să aruncăm o privire mai atentă la ceea ce tocmai am implementat:
- on_click_loadData() – numim funcția addTestData() și o folosim
Funcția btn.clicked.connect() .
- on_click_deleteData() – numim funcția deleteTestData() și folosim
Funcția btn.clicked.connect() .
- randomValueGenerator() – returnează o valoare int aleatorie din intervalul definit
- btn.clicked.connect() – conectăm semnalul cu slotul
- w.show() – arată widget-ul
- app.exec_() -execută o aplicație
Acțiuni DB
Aplicația noastră are nevoie de acțiuni SQL conectate cu acțiuni de buton. Vom folosi conectorul pyodbc pentru a vă conecta la SQL Server DB. Presupun că schema DB este deja prezentă și nu este nevoie să creăm obiecte DB precum tabele etc.
Adăugați date de testare
Funcția addTestData preia valori din interfața de utilizare și le transmite interogării SQL. Dar haideți să parcurgem întregul cod:
- Deschiderea conexiunii la SQL Server DB prin definirea dbAddress
- Setarea valorii id - dacă id-ul tabelului nu este unul cu incrementare automată, trebuie să știm următoarea valoare a id-ului care trebuie utilizat
- Definirea interogării SQL. Vom transmite câteva valori din UI.
import pyodbc import ConfigParser config = ConfigParser.RawConfigParser() config.read('../resources/env.properties') lista = [] login = 'myFancyLogin' def addTestData(db, schema, Name {...}): încerca: dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS; Database="+db+";Trusted_Connection=da; u;pwd=" cnx = pyodbc.connect(dbAddress) cursor = cnx.cursor()+schema+"].[candidați] ORDER BY ID DESC" id = returnValue (cnx, cursor, id) Id = str(id + 1) schema = str(schema) testQuery = 'SELECT DB_NAME() AS [Bază de date curentă];' candidati = "INSERT INTO ["+schema+"].[candidati] VALUES("+Id+",'"+Nume+"',{...}")" returnDBName(cnx, cursor, testQuery) lista = [candidați] executeQuery (cnx, cursor, listă) cu excepția pyodbc.Eroare ca e: print(e) printează „erori în funcția addTestData” altceva: cnx.close()
Blocul de cod 6. Adăugați metoda datelor de testare
Ștergeți datele de testare
Ștergerea datelor de testare este gestionată de funcția deleteTestData(db,schema). Are doar 2 parametri (db,schema). Înseamnă că vrem să curățăm întreaga masă fără a transporta ceea ce este înăuntru.
def deleteTestData(db, schema): încerca: dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS; Database="+db+";Trusted_Connection=da; u;pwd=" cnx = pyodbc.connect(dbAddress) cursor = cnx.cursor() schema = str(schema) testQuery = 'SELECT DB_NAME() AS [Bază de date curentă];' candidați = „ȘTERGERE DIN [„+schemă+”].[candidați]” candidatesProcessed = „ȘTERGERE DIN [„+schema+”].[candidatiProcessed]” returnDBName(cnx, cursor, testQuery) listă = [candidați, candidațiProcessed] executeQuery (cnx, cursor, listă) cu exceptia: tipăriți „erori în funcția deleteTestData” altceva: cnx.close()
Blocul de cod 7. Metoda de ștergere a datelor de testare
Utilaje
Și câteva funcții utilitare utilizate de funcțiile addTestData() și deleteTestData():
def executeQuery (cnx, cursor, listă): pentru eu in lista: cursor.execute(i) cnx.commit() def returnDBName(cnx, cursor, dbQuery): cursor.execute(dbQuery) Valoare = cursor.fetchone() Valoare = Valoare[0] Valoare = str(Valoare)
Blocul de cod 8. Funcții utili
Fișierul exe
În prezent, putem folosi codul nostru dacă Python este instalat și putem compila codul, dar dacă vrem doar să avem un fișier executabil? Biblioteca py2exe permite crearea unui fișier executabil din codul Python (Code Block 9):
din configurarea importului distutils.core import py2exe setup(windows=[numele fișierului cu widget], data_files = data_files, options={ 'py2exe': { „include”:[„sorbiți”], "dll_excludes": ['MSVFW32.dll', „AVIFIL32.dll”, „AVICAP32.dll”, „ADVAPI32.dll”, „CRYPT32.dll”, „WLDAP32.dll”, „MSVCP90.dll”] } })
Blocul de cod 9. Crearea fișierului .exe
Rezultatul
Și iată rezultatul muncii noastre. Sper că v-a plăcut tutorialul!
