Cómo construir un cargador de datos de prueba simple

Publicado: 2022-02-23

Introducción

Los proyectos SQL no son muy populares entre la familia de pruebas. Los ingenieros de pruebas suelen preferir trabajar con UI o API. Pero hay muchos proyectos en los que la lógica comercial se basa en bases de datos relacionales o almacenes de datos y, tarde o temprano, deberá realizar algunas pruebas en DB/DW.

En esos proyectos, al igual que en otros, las pruebas manuales siguen siendo un enfoque válido y requieren la preparación de múltiples configuraciones de datos de prueba. Esto puede ser doloroso cuando se trabaja con múltiples scripts SQL de datos de prueba, muchos objetos de base de datos y esquemas de base de datos. En este artículo, le mostraré cómo crear un cargador de datos de prueba simple.

Interfaz de usuario

Usaremos Python y un servidor SQL como almacenamiento de datos. En primer lugar, construyamos una interfaz de usuario simple para una aplicación de escritorio. Supongo que todas las bibliotecas ya están instaladas, y si no, entonces "pip install [paquete]"

Ventana de configuración

 sistema de importación
importar al azar
desde PyQt4.QtCore importar pyqtSlot,SIGNAL,SLOT
desde PyQt4.QtGui importar *
desde PyQt4.QtCore importar *
importar fecha y hora

       app = QApplication(sys.argv)
       w = QWidget()
       w.setWindowTitle('Generador de datos de prueba')
       w.redimensionar(180, 240)
       w.setFixedSize(800, 460)

       w.setStyleSheet("color de fondo: blanco;")

Bloque de código 1. Ventana de configuración .

Comenzando con una ventana vacía como un widget.

Barra de progreso

Ahora agreguemos una barra de progreso a nuestro cargador de datos de prueba. Nos indicará cuando finaliza la carga o eliminación de datos. El valor inicial obviamente se establece en 0.

 clase QProgBar(QProgressBar):

       valor = 0

   @pyqtSlot()
   def aumentarValor(barraprogreso):
           barraprogreso.setValue(barraprogreso.valor)
           barraprogreso.valor = barraprogreso.valor+1

barra = QProgBar(w)
barra.redimensionar(320,30)
barra.establecerValor(0)
bar.movimiento(460,400)

Bloque de código 2. Configuración de la barra de progreso

El bloque de código 2 contiene algunas cosas que deben explicarse:

  • aumentarValor un método que aumentará el valor de la barra de progreso
  • QProgBar(w) El widget QProgressBar proporciona la barra de progreso

Etiquetas

Necesitamos etiquetas para botones, menús desplegables, campos de entrada, etc.

 lNombre = QLabel(w)
{...}

lNombre.setText("Nombre")
lNombre.move(60,60)
{...}

Bloque de código 3. Establecer etiquetas

Y la explicación del Bloque de Código 3.

  • {…} Obviamente, no pondré todo el código, así que de ahora en adelante usaré este {...} para informar "continuación del código aquí".
  • QLabel(w) -El widget QLabel proporciona un texto

Botones, casillas de verificación y campos de entrada

Repasemos algunos elementos más en nuestra aplicación, comenzando con los botones de acción.

 btnDelete = QPushButton('Eliminar datos de prueba', w)
btnLoad = QPushButton('Cargar datos de prueba', w)
{...}

esquema = QComboBox(w)
esquema.addItem("Esquema de prueba")
esquema.movimiento(200,10)
esquema.resize(120,25)

base de datos = QLineEdit(w)
base de datos.movimiento(30, 10)
base de datos.resize(120,25)
base de datos.setPlaceholderText("Nombre de la base de datos")

nombre1 = QCheckBox('Nombre 1', w)
nombre1.mover(30, 85)
nombre1.setChecked(Verdadero)
{...}

Bloque de código 4. Establecer etiquetas

Los elementos de la aplicación definidos en el Bloque de código 4 son:

  • QPushButton('') : el widget QPushButton proporciona un botón
  • QComboBox(w) – El widget QComboBox es una lista desplegable
  • QLineEdit(w) – El widget QLineEdit es una entrada de texto de una línea.
  • QCheckBox : el widget QCheckBox proporciona una casilla de verificación con una etiqueta de texto

Comportamiento

Ahora viene la parte divertida. Crearemos las acciones y conectaremos las señales con las ranuras.

 @pyqtSlot()
def on_click_loadData():
       barra.establecerValor(25)
       listanombres = []
       {...}

       db = str(base de datos.texto())
       {...}

       if(name1.isChecked()==Verdadero):
       ListaNombres.append("Nombre 1")
       {...}
       if(len(listadenombres)>0):
       Nombre = str(nameList[randomValueGenerator(len(nameList))-1])

       barra.establecerValor(50)
       if(str(schema.currentText())=='Esquema de prueba'):
       addTestData(db, 'Prueba', Nombre, {...})
       {...}
       barra.establecerValor(75)
       barra.establecerValor(100)

def on_click_deleteData():
       barra.establecerValor(25)
       db = str(base de datos.texto())
       barra.establecerValor(50)
       if(str(schema.currentText())=='Esquema de prueba'):
       deleteTestData(db, 'Prueba')
       {...}
       barra.establecerValor(75)
       barra.establecerValor(100)

{...}

def randomValueGenerator(largo):
       volver aleatorio.randint(1,largo)

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

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

btnDelete.clicked.connect(on_click_deleteData)
btnEliminar.mover(300, 400)
btnDelete.resize(120,30)

w.mostrar()
aplicación.exec_()

Bloque de código 5. Establecer etiquetas

Es un código bastante largo. Echemos un vistazo más de cerca a lo que acabamos de implementar:

  • on_click_loadData() – llamamos a la función addTestData() y hacemos uso de

función btn.clicked.connect()

  • on_click_deleteData() – llamamos a la función deleteTestData() y hacemos uso de

función btn.clicked.connect()

  • randomValueGenerator() : devuelve un valor int aleatorio del rango definido
  • btn.clicked.connect() – conectamos la señal con la ranura
  • w.show () – Mostrar widget
  • app.exec_() -ejecutar una aplicación

Acciones de base de datos

Nuestra aplicación necesita acciones SQL conectadas con acciones de botones. Usaremos el conector pyodbc para conectarnos a la base de datos de SQL Server. Supongo que el esquema DB ya está presente y no necesitamos crear objetos DB como tablas, etc.

Agregar datos de prueba

La función addTestData toma valores de la interfaz de usuario y los pasa a la consulta SQL. Pero repasemos todo el código:

  • Abriendo la conexión a SQL Server DB definiendo dbAddress
  • Configuración del valor de identificación: si la identificación de la tabla no es de incremento automático, necesitamos saber el siguiente valor de identificación que se usará
  • Definición de consulta SQL. Pasaremos algunos valores de la interfaz de usuario.
 importar pyodbc
importar ConfigParser

config = ConfigParser.RawConfigParser()
config.read('../resources/env.properties')
lista = []
inicio de sesión = 'myFancyLogin'

def addTestData(db, esquema, Nombre {...}):
   probar:
      dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS; 
                   Base de datos="+db+";Conexión_de_confianza=sí; 
                   u;pwd="
      cnx = pyodbc.connect(dbDirección)
      cursor = cnx.cursor()+schema+"].[candidatos] ORDENAR POR ID 
            DESC"
      id = valor de retorno (cnx, cursor, id)
      Identificación = cadena (identificación + 1)

      esquema = str(esquema)

      testQuery = 'SELECCIONE DB_NAME() COMO [Base de datos actual];'
      candidatos = "INSERTAR EN ["+esquema+"].[candidatos]      
                    VALORES("+Id+",'"+Nombre+"',{...}")"
      returnDBName(cnx, cursor, testQuery)

      lista = [candidatos]
      ejecutar consulta (cnx, cursor, lista)

   excepto pyodbc.Error como e:
      imprimir (e)
      imprimir 'errores en la función addTestData'
   más:
      cnx.cerrar()

Bloque de código 6. Agregar método de datos de prueba

Eliminar datos de prueba

La eliminación de datos de prueba es manejada por la función deleteTestData(db,schema). Tiene solo 2 parámetros (db, esquema). Significa que queremos despejar toda la mesa sin llevar lo que hay dentro.

 def deleteTestData(db, esquema):
   probar:
      dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS;
                   Base de datos="+db+";Conexión_de_confianza=sí;
                   u;pwd="
      cnx = pyodbc.connect(dbDirección)
      cursor = cnx.cursor()
 
      esquema = str(esquema)
 
      testQuery = 'SELECCIONE DB_NAME() COMO [Base de datos actual];'
      candidatos = "ELIMINAR DE ["+esquema+"].[candidatos]"
      candidatosProcesados ​​= "ELIMINAR DE 
                             ["+esquema+"].[candidatosProcesados]"
 
      returnDBName(cnx, cursor, testQuery)
 
      lista = [candidatos, candidatosProcesados]
      ejecutar consulta (cnx, cursor, lista)

   excepto:
      imprimir 'errores en la función deleteTestData'
   más:
      cnx.cerrar()

Bloque de código 7. Eliminar método de datos de prueba

Utiles

Y algunas funciones útiles utilizadas por las funciones addTestData() y deleteTestData():

 def ejecutarConsulta(cnx, cursor, lista):
   para i en la lista:
   cursor.ejecutar(i)
   cnx.commit()

def returnDBName(cnx, cursor, dbQuery):
   cursor.execute(dbQuery)
   Valor = cursor.buscar()
   Valor = Valor[0]
   Valor = str(Valor)

Bloque de código 8. Funciones útiles

archivo ejecutable

Actualmente, podemos usar nuestro código si Python está instalado y podemos compilar el código, pero ¿qué pasa si solo queremos tener un archivo ejecutable? La biblioteca py2exe permite crear un archivo ejecutable a partir del código de Python (Bloque de código 9):

 desde la configuración de importación de distutils.core
importar py2exe
      
setup(windows=[nombre del archivo con widget],
   archivos_datos = archivos_datos,
   opciones={ 'py2exe': {
      "incluye":['sorbo'],
      "dll_excluye": ['MSVFW32.dll',
      'AVIFIL32.dll',
      'AVICAP32.dll',
      'ADVAPI32.dll',
      'CRYPT32.dll',
      'WLDAP32.dll',
      'MSVCP90.dll']
      }
   })

Bloque de código 9. Crear un archivo .exe

El resultado

Y aquí está el resultado de nuestro trabajo. ¡Espero que hayas disfrutado el tutorial!