Come costruire un semplice caricatore di dati di prova
Pubblicato: 2022-02-23Introduzione
I progetti SQL non sono molto popolari nella famiglia di test. Gli ingegneri di test di solito preferiscono lavorare con l'interfaccia utente o l'API. Ma ci sono molti progetti in cui la logica di business risiede nei database relazionali o nei data warehouse e prima o poi dovrai fare dei test su DB/DW.
In questi progetti, come in altri, il test manuale è ancora un approccio valido e richiede la preparazione di più configurazioni di dati di test. Questo può essere doloroso quando si lavora con più script sql di dati di test, molti oggetti DB e schemi DB. In questo articolo, ti mostrerò come creare un semplice caricatore di dati di test.
Interfaccia utente
Utilizzeremo Python e SQL Server come archivio dati. Innanzitutto creiamo una semplice interfaccia utente per un'app desktop. Presumo che tutte le librerie siano già installate e, in caso contrario, "pip install [pacchetto]"
Finestra di impostazione
importazione sist importa a caso da PyQt4.QtCore importa pyqtSlot,SIGNAL,SLOT da importazione PyQt4.QtGui * da importazione PyQt4.QtCore * importa data e ora app = QApplication(sys.argv) w = QWidget() w.setWindowTitle('Test Data Generator') w.resize(180, 240) w.setFixedSize(800, 460) w.setStyleSheet("colore di sfondo: bianco;")
Blocco codice 1. Finestra di impostazione .
A partire da una finestra vuota come widget.
Barra di avanzamento
Ora aggiungiamo una barra di avanzamento al nostro caricatore di dati di test. Ci dirà quando il caricamento o l'eliminazione dei dati è terminato. Il valore iniziale è ovviamente impostato a 0.
classe QProgBar(QProgressBar): valore = 0 @pyqtSlot() def aumentoValore(progressBar): progressBar.setValue(progressBar.value) progressBar.value = progressBar.value+1 barra = QProgBar(w) bar.resize(320,30) bar.setValue(0) barra.sposta(460.400)
Blocco codice 2. Impostazione della barra di avanzamento
Code Block 2. contiene alcune cose da spiegare:
- aumento valore – un metodo che aumenterà il valore della barra di avanzamento
- QProgBar(w) – Il widget QProgressBar fornisce la barra di avanzamento
Etichette
Abbiamo bisogno di etichette per pulsanti, menu a discesa, campi di input ecc.
lNome = QEtichetta(w) {...} lName.setText("Nome") lNome.mossa(60,60) {...}
Blocco codice 3. Impostazione etichette
E la spiegazione del Code Block 3.
- {…} – Ovviamente, non inserirò tutto il codice, quindi d'ora in poi userò questo {…} per informare la "continuazione del codice qui".
- QLabel(w) -Il widget QLabel fornisce un testo
Pulsanti, caselle di controllo e campi di input
Esaminiamo altri elementi della nostra app, a partire dai pulsanti di azione.
btnDelete = QPushButton('Elimina dati di prova', w) btnLoad = QPushButton('Carica dati test', w) {...} schema = QComboBox(w) schema.addItem("Schema di prova") schema.move(200,10) schema.resize(120,25) database = QLineEdit(w) database.move(30, 10) database.resize(120,25) database.setPlaceholderText("Nome DB") nome1 = QCheckBox('Nome 1', w) nome1.mossa(30, 85) name1.setChecked(True) {...}
Blocco codice 4. Impostazione etichette
Gli elementi dell'app definiti in Code Block 4 sono:
- QPushButton('') – Il widget QPushButton fornisce un pulsante
- QComboBox(w) – Il widget QComboBox è un elenco a discesa
- QLineEdit(w) – Il widget QLineEdit è un input di testo di una riga.
- QCheckBox – Il widget QCheckBox fornisce una casella di controllo con un'etichetta di testo
Azioni
Ora arriva la parte divertente. Creeremo le azioni e collegheremo i segnali con gli slot.
@pyqtSlot() def on_click_loadData(): bar.setValue(25) nomeLista = [] {...} db = str(database.text()) {...} if(name1.isChecked()==True): nameList.append("Nome 1") {...} if(len(elenco dei nomi)>0): Nome = str(nameList[randomValueGenerator(len(nameList))-1]) bar.setValue(50) if(str(schema.currentText())=='Schema di test'): addTestData(db, 'Test', Nome, {...}) {...} 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 di test'): deleteTestData(db, 'Test') {...} bar.setValue(75) bar.setValue(100) {...} def randomValueGenerator(len): restituisce 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_()
Blocco codice 5. Impostazione etichette

È un pezzo di codice piuttosto lungo. Diamo un'occhiata più da vicino a ciò che abbiamo appena implementato:
- on_click_loadData() – chiamiamo la funzione addTestData() e ne utilizziamo
btn.clicked.connect() funzione
- on_click_deleteData() – chiamiamo la funzione deleteTestData() e ne utilizziamo
btn.clicked.connect() funzione
- randomValueGenerator() – restituisce un valore int casuale dall'intervallo definito
- btn.clicked.connect() – colleghiamo il segnale con lo slot
- w.show() – mostra il widget
- app.exec_() -esegue un'applicazione
Azioni DB
La nostra app necessita di azioni SQL connesse con le azioni dei pulsanti. Utilizzeremo il connettore pyodbc per connetterci a SQL Server DB. Presumo che lo schema DB sia già presente e non sia necessario creare oggetti DB come tabelle ecc.
Aggiungi dati di prova
La funzione addTestData prende i valori dall'interfaccia utente e li passa alla query SQL. Ma esaminiamo l'intero codice:
- Apertura della connessione al DB di SQL Server definendo dbAddress
- Impostazione del valore id: se l'id della tabella non è un valore di incremento automatico, è necessario conoscere il prossimo valore di id da utilizzare
- Definizione di query SQL. Passeremo alcuni valori dall'interfaccia utente.
importa pyodbc importa ConfigParser config = ConfigParser.RawConfigParser() config.read('../resources/env.properties') lista = [] login = 'myFancyLogin' def addTestData(db, schema, Nome {...}): Tentativo: dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS; Database="+db+";Connessione_Fidabile=sì; tu;pwd=" cnx = pyodbc.connect(dbAddress) cursor = cnx.cursor()+schema+"].[candidati] ORDINA PER ID DESCR" id = valore restituito (cnx, cursore, id) Id = str(id + 1) schema = str(schema) testQuery = 'SELEZIONA NOME_DB() COME [Database corrente];' candidati = "INSERT INTO ["+schema+"].[candidati] VALUES("+Id+",'"+Nome+"',{...}")" returnDBName(cnx, cursore, testQuery) lista = [candidati] executeQuery(cnx, cursore, elenco) tranne pyodbc.Error come e: stampa(e) print 'errori nella funzione addTestData' altro: cnx.close()
Blocco codice 6. Aggiungere il metodo dei dati di prova
Elimina i dati del test
L'eliminazione dei dati di test viene gestita dalla funzione deleteTestData(db,schema). Ha solo 2 parametri (db,schema). Significa che vogliamo sgomberare l'intero tavolo senza portare ciò che c'è dentro.
def deleteTestData(db, schema): Tentativo: dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS; Database="+db+";Connessione_Fidabile=sì; tu;pwd=" cnx = pyodbc.connect(dbAddress) cursore = cnx.cursor() schema = str(schema) testQuery = 'SELEZIONA NOME_DB() COME [Database corrente];' candidati = "ELIMINA DA ["+schema+"].[candidati]" candidatiProcessed = "ELIMINA DA ["+schema+"].[candidatesProcessed]" returnDBName(cnx, cursore, testQuery) lista = [candidati, candidati Elaborati] executeQuery(cnx, cursore, elenco) tranne: print 'Errori nella funzione deleteTestData' altro: cnx.close()
Blocco codice 7. Elimina il metodo dei dati di prova
Utili
E alcune funzioni di utilità utilizzate dalle funzioni addTestData() e deleteTestData():
def executeQuery(cnx, cursor, list): per io in lista: cursor.execute(i) cnx.commit() def returnDBName(cnx, cursore, dbQuery): cursor.execute(dbQuery) Valore = cursor.fetchone() Valore = Valore[0] Valore = str(Valore)
Blocco codice 8. Funzioni utili
Esegui file
Attualmente, possiamo usare il nostro codice se Python è installato e possiamo compilare il codice, ma cosa succede se vogliamo solo avere un file eseguibile? La libreria py2exe permette di creare file eseguibili dal codice Python (Code Block 9):
dalla configurazione di importazione distutils.core importa py2exe setup(windows=[nome del file con widget], file_dati = file_dati, opzioni={ 'py2exe': { "include":['sip'], "dll_excludes": ['MSVFW32.dll', 'AVIFIL32.dll', 'AVICAP32.dll', 'ADVAPI32.dll', 'CRYPT32.dll', 'WLDAP32.dll', 'MSVCP90.dll'] } })
Blocco codice 9. Creazione del file .exe
Il risultato
Ed ecco il risultato del nostro lavoro. Spero che il tutorial ti sia piaciuto!
