如何構建一個簡單的測試數據加載器
已發表: 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 文件
結果
這是我們工作的結果。 希望你喜歡這個教程!
