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