如何構建一個簡單的測試數據加載器

已發表: 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 文件

結果

這是我們工作的結果。 希望你喜歡這個教程!