Как создать простой загрузчик тестовых данных
Опубликовано: 2022-02-23вступление
Проекты SQL не очень популярны среди тестировщиков. Инженеры-испытатели обычно предпочитают работать с пользовательским интерфейсом или API. Но есть много проектов, где бизнес-логика лежит в реляционных базах данных или хранилищах данных, и рано или поздно вам нужно будет провести какое-то тестирование на БД/ХД.
В этих проектах, как и в других, ручное тестирование по-прежнему является допустимым подходом и требует подготовки нескольких конфигураций тестовых данных. Это может быть болезненно при работе с несколькими SQL-скриптами тестовых данных, множеством объектов БД и схемами БД. В этой статье я покажу вам, как создать простой загрузчик тестовых данных.
Пользовательский интерфейс
Мы будем использовать Python и SQL Server в качестве хранилища данных. Во-первых, давайте создадим простой пользовательский интерфейс для настольного приложения. Я предполагаю, что все библиотеки уже установлены, а если нет, то «pip install [package]»
Окно настроек
импорт системы
импортировать случайный
из PyQt4.QtCore импортировать pyqtSlot,SIGNAL,SLOT
из импорта PyQt4.QtGui *
из импорта PyQt4.QtCore *
импорт даты и времени
приложение = QApplication (sys.argv)
ш = Qвиджет ()
w.setWindowTitle('Генератор тестовых данных')
w.изменить размер(180, 240)
w.setFixedSize (800, 460)
w.setStyleSheet ("цвет фона: белый;")Блок кода 1. Окно настроек .
Начиная с пустого окна в качестве виджета.
Индикатор
Теперь давайте добавим индикатор выполнения в наш загрузчик тестовых данных. Он сообщит нам, когда загрузка или удаление данных закончится. Начальное значение, очевидно, равно 0.
класс QProgBar (QProgressBar):
значение = 0
@pyqtSlot()
определение увеличения значения (прогрессбар):
progressBar.setValue (progressBar.value)
progressBar.value = progressBar.value+1
бар = QProgBar(ш)
bar.resize(320,30)
бар.setValue (0)
бар.движение(460,400)Блок кода 2. Настройка индикатора выполнения
Блок кода 2. содержит несколько пояснений:
- увеличить значение – метод, который увеличит значение индикатора выполнения
- QProgBar(ш) – Виджет QProgressBar предоставляет индикатор выполнения.
Этикетки
Нам нужны метки для кнопок, выпадающих списков, полей ввода и т. д.
лИмя = QLabel(w)
{...}
lName.setText("Имя")
lName.move(60,60)
{...}Блок кода 3. Установка меток
И объяснение блока кода 3.
- {…} – Очевидно, что я не буду помещать весь код, поэтому с этого момента я буду использовать этот {…} , чтобы сообщать «продолжение кода здесь».
- QLabel(w) — виджет QLabel предоставляет текст
Кнопки, флажки и поля ввода
Давайте рассмотрим еще несколько элементов нашего приложения, начиная с кнопок действий.
btnDelete = QPushButton('Удалить тестовые данные', w)
btnLoad = QPushButton('Загрузить тестовые данные', w)
{...}
схема = QComboBox(w)
schema.addItem("Схема теста")
схема.переместить(200,10)
схема.изменить размер(120,25)
база данных = QLineEdit(w)
база данных.move(30, 10)
база данных.изменить размер(120,25)
database.setPlaceholderText("Имя БД")
name1 = QCheckBox('Имя 1', w)
имя1.переместить(30, 85)
имя1.setChecked(Истина)
{...}Блок кода 4. Установка меток
Элементы приложения, определенные в блоке кода 4:
- QPushButton('') – виджет QPushButton предоставляет кнопку
- QComboBox(w) — виджет QComboBox представляет собой раскрывающийся список.
- QLineEdit(w) — виджет QLineEdit представляет собой однострочный ввод текста.
- QCheckBox — виджет QCheckBox предоставляет флажок с текстовой меткой.
Действия
Теперь самое интересное. Мы создадим действия и свяжем сигналы со слотами.
@pyqtSlot()
защита on_click_loadData():
бар.setValue(25)
список имен = []
{...}
БД = ул(база данных.текст())
{...}
если(name1.isChecked()==True):
nameList.append("Имя 1")
{...}
если (длина (список имен)> 0):
Имя = str(nameList[randomValueGenerator(len(nameList))-1])
бар.setValue(50)
if(str(schema.currentText())=='Схема теста'):
addTestData(db, 'Тест', Имя, {...})
{...}
бар.setValue(75)
бар.setValue(100)
защита on_click_deleteData():
бар.setValue(25)
БД = ул(база данных.текст())
бар.setValue(50)
if(str(schema.currentText())=='Схема теста'):
удалитьTestData (дб, 'Тест')
{...}
бар.setValue(75)
бар.setValue(100)
{...}
Def randomValueGenerator (длина):
вернуть 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()
приложение.exec_()Блок кода 5. Установка меток

Это довольно длинный кусок кода. Давайте подробнее рассмотрим то, что мы только что реализовали:
- on_click_loadData() — мы вызываем функцию addTestData() и используем
функция btn.clicked.connect()
- on_click_deleteData() — вызываем функцию deleteTestData() и используем
функция btn.clicked.connect()
- randomValueGenerator() — возвращает случайное целочисленное значение из заданного диапазона
- btn.clicked.connect() — соединяем сигнал со слотом
- w.show() — показать виджет
- app.exec_() - запустить приложение
Действия с БД
Нашему приложению нужны действия SQL, связанные с действиями кнопок. Мы будем использовать соединитель pyodbc для подключения к базе данных SQL Server. Я предполагаю, что схема БД уже присутствует, и нам не нужно создавать объекты БД, такие как таблицы и т. д.
Добавить тестовые данные
Функция addTestData берет значения из пользовательского интерфейса и передает их SQL-запросу. Но давайте пройдемся по всему коду:
- Открытие соединения с БД SQL Server путем определения dbAddress
- Установка значения идентификатора — если идентификатор таблицы не является автоматически увеличивающимся, нам нужно знать следующее значение идентификатора, которое будет использоваться.
- Определение SQL-запроса. Мы передадим несколько значений из пользовательского интерфейса.
импортировать pyodbc
импортировать ConfigParser
config = ConfigParser.RawConfigParser()
config.read('../resources/env.properties')
список = []
логин = 'myFancyLogin'
def addTestData(db, схема, имя {...}):
пытаться:
dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS;
База данных="+db+";Trusted_Connection=yes;
у;pwd="
cnx = pyodbc.connect(dbAddress)
курсор = cnx.cursor()+schema+"].[кандидаты] ORDER BY ID
ДЕСК"
id = returnValue (cnx, курсор, идентификатор)
Идентификатор = ул (идентификатор + 1)
схема = ул (схема)
testQuery = 'ВЫБЕРИТЕ ИМЯ_БД() КАК [Текущая база данных];'
кандидаты = "ВСТАВИТЬ В ["+схема+"].[кандидаты]
ЗНАЧЕНИЯ("+Id+",'"+Имя+"',{...}")"
returnDBName (cnx, курсор, testQuery)
список = [кандидаты]
выполнить запрос (cnx, курсор, список)
кроме pyodbc.Error как e:
печать (е)
напечатать «ошибки в функции addTestData»
еще:
cnx.close()Блок кода 6. Добавить метод тестовых данных
Удалить тестовые данные
Удаление тестовых данных обрабатывается функцией deleteTestData(db,schema). У него всего 2 параметра (db, schema). Это значит, что мы хотим очистить весь стол, не унося с собой то, что внутри.
def deleteTestData (БД, схема):
пытаться:
dbAddress = "Driver={SQL Server};Server=localhost\SQLEXPRESS;
База данных="+db+";Trusted_Connection=yes;
у;pwd="
cnx = pyodbc.connect(dbAddress)
курсор = cnx.cursor()
схема = ул (схема)
testQuery = 'ВЫБЕРИТЕ ИМЯ_БД() КАК [Текущая база данных];'
Кандидаты = "УДАЛИТЬ ИЗ ["+схема+"].[кандидаты]"
Кандидаты в обработку = "УДАЛИТЬ ИЗ
["+схема+"].[кандидаты обработаны]"
returnDBName (cnx, курсор, testQuery)
список = [кандидаты, кандидаты обработаны]
выполнить запрос (cnx, курсор, список)
кроме:
напечатать «ошибки в функции deleteTestData»
еще:
cnx.close()Блок кода 7. Метод удаления тестовых данных
Утилиты
И некоторые вспомогательные функции, используемые функциями addTestData() и deleteTestData():
def executeQuery (cnx, курсор, список): для я в списке: курсор.execute(я) cnx.commit() def returnDBName (cnx, курсор, dbQuery): курсор.execute(dbQuery) Значение = курсор.fetchone() Значение = Значение [0] Значение = ул (значение)
Блок кода 8. Функции Util
Исполняемый файл
В настоящее время мы можем использовать наш код, если установлен Python, и мы можем скомпилировать код, но что, если мы просто хотим иметь исполняемый файл? Библиотека py2exe позволяет создать исполняемый файл из кода Python (блок кода 9):
из настройки импорта distutils.core
импортировать py2exe
setup(windows=[имя файла с виджетом],
файлы_данных = файлы_данных,
параметры = { 'py2exe': {
"включает": ['глоток'],
"dll_excludes": ['MSVFW32.dll',
'AVIFIL32.dll',
'AVICAP32.dll',
'ADVAPI32.dll',
'CRYPT32.dll',
'WLDAP32.dll',
'MSVCP90.dll']
}
})Блок кода 9. Создание файла .exe
Результат
И вот результат нашей работы. Надеюсь, вам понравился урок!

