如何构建一个简单的测试数据加载器
已发表: 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 文件
结果
这是我们工作的结果。 希望你喜欢这个教程!

