วิธีสร้างตัวโหลดข้อมูลทดสอบอย่างง่าย
เผยแพร่แล้ว: 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
ผลลัพธ์
และนี่คือผลงานของเรา หวังว่าคุณจะสนุกกับการกวดวิชา!

