Как создать простой загрузчик тестовых данных

Опубликовано: 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

Результат

И вот результат нашей работы. Надеюсь, вам понравился урок!