วิธีสร้างตัวโหลดข้อมูลทดสอบอย่างง่าย

เผยแพร่แล้ว: 2022-02-23

บทนำ

โปรเจ็กต์ SQL นั้นไม่ค่อยได้รับความนิยมในกลุ่มการทดสอบ วิศวกรทดสอบมักจะชอบทำงานกับ UI หรือ API แต่มีโครงการมากมายที่ตรรกะทางธุรกิจอยู่ในฐานข้อมูลเชิงสัมพันธ์หรือคลังข้อมูล และไม่ช้าก็เร็ว คุณจะต้องทำการทดสอบบน DB/DW

ในโปรเจ็กต์เหล่านั้น เช่นเดียวกับในโปรเจ็กต์อื่นๆ การทดสอบด้วยตนเองยังคงเป็นแนวทางที่ถูกต้อง และต้องมีการเตรียมการกำหนดค่าข้อมูลการทดสอบหลายรายการ สิ่งนี้อาจเจ็บปวดเมื่อทำงานกับสคริปต์ sql ข้อมูลทดสอบหลายตัว อ็อบเจ็กต์ DB และ DB schema จำนวนมาก ในบทความนี้ ผมจะแสดงวิธีสร้างตัวโหลดข้อมูลทดสอบอย่างง่าย

หน้าจอผู้ใช้

เราจะใช้ Python และ SQL Server เป็นที่เก็บข้อมูล ขั้นแรก มาสร้าง UI แบบง่ายสำหรับแอปเดสก์ท็อปกัน ฉันถือว่าไลบรารีทั้งหมดได้รับการติดตั้งแล้ว และถ้าไม่ใช่ แสดงว่า "pip install [package]"

การตั้งค่าหน้าต่าง

 นำเข้าsys
นำเข้าสุ่ม
จาก 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):
           ProgressBar.setValue (progressBar.value)
           ProgressBar.value = ProgressBar.value+1

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

Code Block 2 การตั้งค่าแถบความคืบหน้า

Code Block 2 มีบางสิ่งที่จะอธิบาย:

  • เพิ่มมูลค่า วิธีการที่จะเพิ่มค่าแถบความคืบหน้า
  • คิวโปรกบาร์(ญ) วิดเจ็ต QProgressBar มีแถบความคืบหน้า

ป้าย

เราต้องการป้ายกำกับสำหรับปุ่ม ดรอปดาวน์ ช่องใส่ข้อมูล ฯลฯ

 lName = QLabel(w)
{...}

lName.setText("ชื่อ")
lName.move(60,60)
{...}

Code Block 3. การตั้งป้าย

และคำอธิบายของ Code Block 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)
ฐานข้อมูล.ปรับขนาด(120,25)
database.setPlaceholderText("ชื่อฐานข้อมูล")

name1 = QCheckBox ('ชื่อ 1', w)
name1.move(30,85)
name1.setChecked(จริง)
{...}

Code Block 4. การตั้งป้าย

องค์ประกอบแอพที่กำหนดไว้ใน Code Block 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")
       {...}
       if(len(nameList)>0):
       ชื่อ = str(nameList[randomValueGenerator(len(nameList))-1])

       bar.setValue(50)
       if(str(schema.currentText())=='Test Schema'):
       addTestData(db, 'ทดสอบ', ชื่อ, {...})
       {...}
       bar.setValue(75)
       bar.setValue(100)

def on_click_deleteData():
       bar.setValue(25)
       db = str(database.text())
       bar.setValue(50)
       if(str(schema.currentText())=='Test Schema'):
       deleteTestData(db, 'ทดสอบ')
       {...}
       bar.setValue(75)
       bar.setValue(100)

{...}

def randomValueGenerator (เลน):
       ส่งคืน random.randint (1,len)

btnStructure.clicked.connect (on_click_createStructure)
btnSstructure.move(20, 400)
btnSstructure.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_()

Code Block 5. การตั้งป้าย

เป็นโค้ดที่ค่อนข้างยาว มาดูกันว่าเราเพิ่งดำเนินการอะไรไปบ้าง:

  • on_click_loadData() – เราเรียกฟังก์ชัน addTestData() และใช้ประโยชน์จาก

btn.clicked.connect() ฟังก์ชั่น

  • on_click_deleteData() – เราเรียกฟังก์ชัน deleteTestData() และใช้ประโยชน์จาก

btn.clicked.connect() ฟังก์ชั่น

  • randomValueGenerator() – ส่งคืนค่า int แบบสุ่มจากช่วงที่กำหนด
  • btn.clicked.connect() – เราเชื่อมต่อสัญญาณกับ slot
  • w.show() – แสดงวิดเจ็ต
  • app.exec_() - เรียกใช้แอปพลิเคชัน

การทำงานของฐานข้อมูล

แอปของเราต้องการการดำเนินการ SQL ที่เชื่อมต่อกับการทำงานของปุ่ม เราจะใช้ตัวเชื่อมต่อ pyodbc เพื่อเชื่อมต่อกับ SQL Server DB ฉันถือว่า DB schema มีอยู่แล้วและเราไม่จำเป็นต้องสร้างวัตถุ DB เช่นตารางเป็นต้น

เพิ่มข้อมูลการทดสอบ

ฟังก์ชัน addTestData นำค่าจาก UI และส่งผ่านไปยังแบบสอบถาม SQL แต่มาดูรหัสทั้งหมดกัน:

  • การเปิดการเชื่อมต่อกับ SQL Server DB โดยกำหนด dbAddress
  • การตั้งค่า id – หาก id ตารางไม่ใช่การเพิ่มอัตโนมัติ เราจำเป็นต้องทราบค่าถัดไปของ id ที่จะใช้
  • คำจำกัดความของแบบสอบถาม SQL เราจะส่งต่อค่าบางส่วนจาก UI
 นำเข้า pyodbc
นำเข้า ConfigParser

config = ConfigParser.RawConfigParser ()
config.read('../resources/env.properties')
รายการ = []
เข้าสู่ระบบ = 'myFancyLogin'

def addTestData(db, สคีมา, ชื่อ {...}):
   ลอง:
      dbAddress = "ไดร์เวอร์={SQL Server};Server=localhost\SQLEXPRESS; 
                   ฐานข้อมูล="+db+";Trusted_Connection=yes; 
                   u;pwd="
      cnx = pyodbc.connect (dbAddress)
      เคอร์เซอร์ = cnx.cursor()+schema+"].[ผู้สมัคร] ORDER BY ID 
            รายละเอียด"
      id = returnValue (cnx, เคอร์เซอร์, id)
      รหัส = str(id + 1)

      สคีมา = str(สคีมา)

      testQuery = 'เลือก DB_NAME () เป็น [ฐานข้อมูลปัจจุบัน];'
      ผู้สมัคร = "INSERT INTO ["+schema+"].[ผู้สมัคร]      
                    VALUES("+Id+",",+Name+"',{...}")"
      returnDBName(cnx, เคอร์เซอร์, testQuery)

      รายการ = [ผู้สมัคร]
      executeQuery(cnx, เคอร์เซอร์, รายการ)

   ยกเว้น pyodbc.Error เป็น e:
      พิมพ์ (จ)
      พิมพ์ 'ข้อผิดพลาดในฟังก์ชัน addTestData'
   อื่น:
      cnx.close()

Code Block 6. เพิ่มวิธีข้อมูลการทดสอบ

ลบข้อมูลการทดสอบ

การลบข้อมูลการทดสอบได้รับการจัดการโดยฟังก์ชัน deleteTestData(db,schema) มีเพียง 2 พารามิเตอร์ (db,schema) หมายความว่าเราต้องการล้างโต๊ะทั้งหมดโดยไม่ต้องพกของข้างใน

 def deleteTestData (db, สคีมา):
   ลอง:
      dbAddress = "ไดร์เวอร์={SQL Server};Server=localhost\SQLEXPRESS;
                   ฐานข้อมูล="+db+";Trusted_Connection=yes;
                   u;pwd="
      cnx = pyodbc.connect (dbAddress)
      เคอร์เซอร์ = cnx.cursor()
 
      สคีมา = str(สคีมา)
 
      testQuery = 'เลือก DB_NAME () เป็น [ฐานข้อมูลปัจจุบัน];'
      ผู้สมัคร = "ลบออกจาก ["+schema+"].[ผู้สมัคร]"
      CandidateProcessed = "ลบออกจาก 
                             ["+สคีมา+"].[ผู้สมัครที่ดำเนินการแล้ว]"
 
      returnDBName(cnx, เคอร์เซอร์, testQuery)
 
      list = [ผู้สมัคร, ผู้สมัครที่ดำเนินการแล้ว]
      executeQuery(cnx, เคอร์เซอร์, รายการ)

   ยกเว้น:
      พิมพ์ 'ข้อผิดพลาดในฟังก์ชัน deleteTestData'
   อื่น:
      cnx.close()

Code Block 7. ลบวิธีข้อมูลการทดสอบ

ยูทิลิตี้

และฟังก์ชัน utils บางส่วนที่ใช้โดยฟังก์ชัน addTestData() และ deleteTestData():

 def executeQuery(cnx, เคอร์เซอร์, รายการ):
   สำหรับฉันในรายการ:
   เคอร์เซอร์.execute(i)
   cnx.commit()

def returnDBName (cnx, เคอร์เซอร์, dbQuery):
   เคอร์เซอร์.execute(dbQuery)
   ค่า = cursor.fetchone()
   ค่า = ค่า[0]
   ค่า = str(ค่า)

Code Block 8 ฟังก์ชั่นการใช้งาน

ไฟล์ exe

ปัจจุบันเราสามารถใช้โค้ดของเราได้หากติดตั้ง Python และคอมไพล์โค้ดได้ แต่ถ้าเราต้องการเพียงไฟล์ปฏิบัติการล่ะ ไลบรารี py2exe อนุญาตให้สร้างไฟล์เรียกทำงานจากโค้ด Python (Code Block 9):

 จากการตั้งค่าการนำเข้า distutils.core
นำเข้า py2exe
      
ตั้งค่า (windows=[ชื่อไฟล์พร้อมวิดเจ็ต],
   data_files = data_files,
   ตัวเลือก={ 'py2exe': {
      "รวม":['sip'],
      "dll_excludes": ['MSVFW32.dll',
      'AVIFIL32.dll',
      'AVICAP32.dll',
      'ADVAPI32.dll',
      'CRYPT32.dll',
      'WLDAP32.dll',
      'MSVCP90.dll']
      }
   })

Code Block 9. การสร้างไฟล์ .exe

ผลลัพธ์

และนี่คือผลงานของเรา หวังว่าคุณจะสนุกกับการกวดวิชา!