Cómo construir un cargador de datos de prueba simple
Publicado: 2022-02-23Introducció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!
