Как создать простой загрузчик тестовых данных
Опубликовано: 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
Результат
И вот результат нашей работы. Надеюсь, вам понравился урок!
