Cum să construiți un încărcător simplu de date de testare

Publicat: 2022-02-23

Introducere

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!