如何构建一个简单的测试数据加载器

已发表: 2022-02-23

介绍

SQL 项目在测试家族中不是很流行。 测试工程师通常更喜欢使用 UI 或 API。 但是有很多项目的业务逻辑位于关系数据库或数据仓库中,迟早您需要对 DB/DW 进行一些测试。

在这些项目中,与其他项目一样,手动测试仍然是一种有效的方法,并且需要准备多个测试数据配置。 当使用多个测试数据 sql 脚本、大量数据库对象和数据库模式时,这可能会很痛苦。 在本文中,我将向您展示如何构建一个简单的测试数据加载器。

用户界面

我们将使用 Python 和 SQL Server 作为数据存储。 首先,让我们为桌面应用程序构建一个简单的 UI。 我假设所有库都已安装,如果没有,则“pip install [package]”

设置窗口

 导入系统
随机导入
从 PyQt4.QtCore 导入 pyqtSlot,SIGNAL,SLOT
从 PyQt4.QtGui 导入 *
从 PyQt4.QtCore 导入 *
导入日期时间

       应用程序 = QApplication(sys.argv)
       w = QWidget()
       w.setWindowTitle('测试数据生成器')
       w.resize(180, 240)
       w.setFixedSize(800, 460)

       w.setStyleSheet("背景色:白色;")

代码块 1. 设置窗口

从作为小部件的空窗口开始。

进度条

现在让我们为我们的测试数据加载器添加一个进度条。 它会告诉我们加载或删除数据何时结束。 初始值显然设置为 0。

 QProgBar 类(QProgressBar):

       值 = 0

   @pyqtSlot()
   def 增加值(进度条):
           progressBar.setValue(progressBar.value)
           进度条.值 = 进度条.值+1

bar = QProgBar(w)
bar.resize(320,30)
bar.setValue(0)
bar.move(460,400)

代码块 2. 设置进度条

代码块 2. 包含一些需要解释的内容:

  • 增加值 增加进度条值的方法
  • QProgBar(w) QProgressBar 小部件提供进度条

标签

我们需要按钮、下拉菜单、输入字段等的标签。

 lName = QLabel(w)
{...}

lName.setText("姓名")
lName.move(60,60)
{...}

代码块 3. 设置标签

以及代码块 3 的解释。

  • {…} —— 显然,我不会把所有的代码都放上去,所以从现在开始我会用这个{…}来通知“代码在这里继续”。
  • QLabel(w) - QLabel 小部件提供文本

按钮、复选框和输入字段

让我们来看看我们应用程序中的更多元素,从操作按钮开始。

 btnDelete = QPushButton('删除测试数据', w)
btnLoad = QPushButton('加载测试数据', w)
{...}

架构 = QComboBox(w)
schema.addItem("测试架构")
schema.move(200,10)
schema.resize(120,25)

数据库 = QLineEdit(w)
数据库.move(30, 10)
数据库.resize(120,25)
database.setPlaceholderText("数据库名称")

name1 = QCheckBox('名称 1', w)
name1.move(30, 85)
name1.setChecked(True)
{...}

代码块 4. 设置标签

代码块 4 中定义的应用程序元素是:

  • QPushButton('') - QPushButton 小部件提供了一个按钮
  • QComboBox(w) – QComboBox 小部件是一个下拉列表
  • QLineEdit(w) – QLineEdit 小部件是单行文本输入。
  • QCheckBox – QCheckBox 小部件提供带有文本标签的复选框

行动

有趣的来了。 我们将创建动作并将信号与插槽连接起来。

 @pyqtSlot()
def on_click_loadData():
       bar.setValue(25)
       名称列表 = []
       {...}

       db = str(database.text())
       {...}

       if(name1.isChecked()==True):
       nameList.append("名称 1")
       {...}
       如果(长度(名称列表)>0):
       名称 = str(nameList[randomValueGenerator(len(nameList))-1])

       bar.setValue(50)
       if(str(schema.currentText())=='测试模式'):
       addTestData(db, 'Test', Name, {...})
       {...}
       bar.setValue(75)
       bar.setValue(100)

def on_click_deleteData():
       bar.setValue(25)
       db = str(database.text())
       bar.setValue(50)
       if(str(schema.currentText())=='测试模式'):
       删除测试数据(数据库,'测试')
       {...}
       bar.setValue(75)
       bar.setValue(100)

{...}

def randomValueGenerator(len):
       返回随机数.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()
app.exec_()

代码块 5. 设置标签

这是一段相当长的代码。 让我们仔细看看我们刚刚实现的内容:

  • on_click_loadData() – 我们调用 addTestData() 函数并使用

btn.clicked.connect()函数

  • on_click_deleteData() – 我们调用 deleteTestData() 函数并使用

btn.clicked.connect()函数

  • randomValueGenerator() – 从定义的范围内返回随机 int 值
  • btn.clicked.connect() – 我们将信号与插槽连接
  • w.show() - 显示小部件
  • app.exec_ () - 执行应用程序

数据库操作

我们的应用程序需要与按钮操作相关的 SQL 操作。 我们将使用 pyodbc 连接器连接到 SQL Server DB。 我假设数据库模式已经存在,我们不需要创建数据库对象,如表等。

添加测试数据

addTestData 函数从 UI 获取值并将它们传递给 SQL 查询。 但是让我们看一下整个代码:

  • 通过定义 dbAddress 打开与 SQL Server DB 的连接
  • 设置 id 值——如果表 id 不是自动递增的,我们需要知道要使用的下一个 id 值
  • SQL 查询定义。 我们将从 UI 传递一些值。
 导入pyodbc
导入配置解析器

配置 = ConfigParser.RawConfigParser()
config.read('../resources/env.properties')
列表 = []
登录 = 'myFancyLogin'

def addTestData(db, schema, Name {...}):
   尝试:
      dbAddress = "驱动程序={SQL Server};服务器=localhost\SQLEXPRESS; 
                   数据库="+db+";Trusted_Connection=yes; 
                   你;密码=“
      cnx = pyodbc.connect(dbAddress)
      cursor = cnx.cursor()+schema+"].[candidates] ORDER BY ID 
            描述”
      id = returnValue(cnx, cursor, id)
      ID = str(id + 1)

      架构 = str(架构)

      testQuery = 'SELECT DB_NAME() AS [当前数据库];'
      候选人=“插入到[“+模式+”]。[候选人]      
                    VALUES("+Id+",'"+Name+"',{...}")"
      returnDBName(cnx, cursor, testQuery)

      名单 = [候选人]
      执行查询(cnx,光标,列表)

   除了 pyodbc.Error 为 e:
      打印(e)
      print 'addTestData 函数中的错误'
   别的:
      cnx.close()

代码块 6. 添加测试数据方法

删除测试数据

测试数据的删除由 deleteTestData(db,schema) 函数处理。 它只有 2 个参数(db、schema)。 这意味着我们要清理整个桌子而不携带里面的东西。

 def deleteTestData(数据库,模式):
   尝试:
      dbAddress = "驱动程序={SQL Server};服务器=localhost\SQLEXPRESS;
                   数据库="+db+";Trusted_Connection=yes;
                   你;密码=“
      cnx = pyodbc.connect(dbAddress)
      光标 = cnx.cursor()
 
      架构 = str(架构)
 
      testQuery = 'SELECT DB_NAME() AS [当前数据库];'
      候选人=“从[“+模式+”]中删除。[候选人]”
      候选人处理 = "删除 
                             ["+schema+"].[candidatesProcessed]"
 
      returnDBName(cnx, cursor, testQuery)
 
      list = [候选人,候选人已处理]
      执行查询(cnx,光标,列表)

   除了:
      print 'deleteTestData 函数中的错误'
   别的:
      cnx.close()

代码块 7. 删除测试数据方法

实用程序

以及 addTestData() 和 deleteTestData() 函数使用的一些 utils 函数:

 def executeQuery(cnx, cursor, list):
   对于列表中的 i:
   cursor.execute(i)
   cnx.commit()

def returnDBName(cnx, cursor, dbQuery):
   cursor.execute(dbQuery)
   值 = cursor.fetchone()
   价值 = 价值[0]
   值 = str(值)

代码块 8. 实用程序函数

可执行文件

目前,如果安装了 Python,我们可以使用我们的代码并且我们可以编译代码,但是如果我们只想拥有一个可执行文件怎么办? py2exe 库允许从 Python 代码(代码块 9)创建可执行文件:

 从 distutils.core 导入设置
导入py2exe
      
setup(windows=[带有小部件的文件名],
   数据文件 = 数据文件,
   选项={'py2exe':{
      “包括”:['sip'],
      “dll_excludes”:['MSVFW32.dll',
      'AVIFIL32.dll',
      'AVICAP32.dll',
      'ADVAPI32.dll',
      'CRYPT32.dll',
      'WLDAP32.dll',
      'MSVCP90.dll']
      }
   })

代码块 9. 创建 .exe 文件

结果

这是我们工作的结果。 希望你喜欢这个教程!