كيفية بناء محمل بيانات اختبار بسيط

نشرت: 2022-02-23

مقدمة

لا تحظى مشاريع SQL بشعبية كبيرة بين عائلة الاختبار. يفضل مهندسو الاختبار عادةً العمل مع واجهة المستخدم أو واجهة برمجة التطبيقات. ولكن هناك الكثير من المشاريع حيث يكمن منطق الأعمال في قواعد البيانات العلائقية أو مستودعات البيانات ، وستحتاج عاجلاً أم آجلاً إلى إجراء بعض الاختبارات على DB / DW.

في هذه المشاريع ، وبنفس الطريقة كما في المشاريع الأخرى ، لا يزال الاختبار اليدوي نهجًا صالحًا ويتطلب إعداد تكوينات بيانات اختبار متعددة. يمكن أن يكون هذا مؤلمًا عند العمل مع العديد من البرامج النصية لبيانات الاختبار ، والكثير من كائنات قاعدة البيانات ومخططات قاعدة البيانات. في هذه المقالة ، سأوضح لك كيفية إنشاء أداة تحميل بيانات اختبار بسيطة.

واجهة المستخدم

سنستخدم Python و SQL Server كمخزن للبيانات. أولاً ، دعونا نبني واجهة مستخدم بسيطة لتطبيق سطح المكتب. أفترض أن جميع المكتبات مثبتة بالفعل ، وإذا لم يكن الأمر كذلك ، فحينئذٍ "pip install [package]"

نافذة الإعداد

 استيراد النظم
استيراد عشوائي
من PyQt4.QtCore استيراد pyqtSlot ، SIGNAL ، SLOT
من استيراد PyQt4.QtGui *
من استيراد PyQt4.QtCore *
استيراد التاريخ والوقت

       التطبيق = QApplication (sys.argv)
       ث = QWidget ()
       w.setWindowTitle ("اختبار مولد البيانات")
       حجم w (180، 240)
       w.setFixedSize (800، 460)

       w.setStyleSheet ("background-color: white؛")

كود بلوك 1. نافذة الإعداد .

بدءا من نافذة فارغة كأداة.

شريط التقدم

الآن دعنا نضيف شريط تقدم إلى أداة تحميل بيانات الاختبار الخاصة بنا. سيخبرنا عند انتهاء تحميل البيانات أو حذفها. من الواضح أن القيمة الأولية مضبوطة على 0.

 فئة QProgBar (QProgressBar):

       القيمة = 0

   pyqtSlot ()
   زيادة defValue (progressBar):
           ProgressBar.setValue (progressBar.value)
           ProgressBar.value = progressBar.value + 1

شريط = QProgBar (ث)
bar.resize (320،30)
bar.setValue (0)
bar.move (460،400)

Code Block 2. إعداد شريط التقدم

يحتوي Code Block 2. على بعض الأشياء التي يجب شرحها:

  • زيادة القيمة - طريقة من شأنها زيادة قيمة شريط التقدم
  • QProgBar (ث) - توفر أداة QProgressBar شريط التقدم

ملصقات

نحتاج إلى تسميات للأزرار والقوائم المنسدلة وحقول الإدخال وما إلى ذلك.

 lName = QLabel (w)
{...}

lName.setText ("الاسم")
lName.move (60،60)
{...}

Code Block 3. إعداد الملصقات

وشرح كود بلوك 3.

  • {…} - من الواضح أنني لن أضع كل الكود ، لذا من الآن فصاعدًا سأستخدم هذا {…} للإبلاغ عن "استمرار الكود هنا".
  • QLabel (w) - توفر أداة QLabel نصًا

الأزرار ومربعات الاختيار وحقول الإدخال

لنستعرض بعض العناصر الإضافية في تطبيقنا ، بدءًا من أزرار الإجراءات.

 btnDelete = QPushButton ("حذف بيانات الاختبار" ، w)
btnLoad = QPushButton ("تحميل بيانات الاختبار" ، w)
{...}

المخطط = QComboBox (w)
schema.addItem ("مخطط الاختبار")
حركة المخطط (200،10)
حجم المخطط (120،25)

قاعدة البيانات = QLineEdit (w)
database.move (30، 10)
database.resize (120،25)
database.setPlaceholderText ("اسم DB")

name1 = QCheckBox ("الاسم 1"، w)
name1.move (30 ، 85)
name1.setChecked (صواب)
{...}

كتلة التعليمات البرمجية 4. تعيين الملصقات

عناصر التطبيق المحددة في Code Block 4 هي:

  • QPushButton ('') - توفر أداة QPushButton زرًا
  • QComboBox (w) - أداة QComboBox عبارة عن قائمة منسدلة
  • QLineEdit (w) - أداة QLineEdit هي إدخال نص من سطر واحد.
  • QCheckBox - توفر أداة QCheckBox مربع اختيار مع تسمية نصية

أجراءات

الآن يأتي الجزء الممتع. سنقوم بإنشاء الإجراءات وربط الإشارات بالفتحات.

 pyqtSlot ()
def on_click_loadData ():
       bar.setValue (25)
       nameList = []
       {...}

       db = str (database.text ())
       {...}

       إذا (name1.isChecked () == صحيح):
       nameList.append ("الاسم 1")
       {...}
       إذا (len (nameList)> 0):
       الاسم = str (nameList [randomValueGenerator (len (nameList)) - 1])

       bar.setValue (50)
       إذا (str (schema.currentText ()) == 'Test Schema'):
       addTestData (db، 'Test'، Name، {...})
       {...}
       bar.setValue (75)
       bar.setValue (100)

def on_click_deleteData ():
       bar.setValue (25)
       db = str (database.text ())
       bar.setValue (50)
       إذا (str (schema.currentText ()) == 'Test Schema'):
       deleteTestData (db، "Test")
       {...}
       bar.setValue (75)
       bar.setValue (100)

{...}

def randomValueGenerator (لين):
       إرجاع عشوائي.randint (1 ، لين)

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_ ()

Code Block 5. إعداد الملصقات

إنه جزء طويل جدًا من التعليمات البرمجية. دعنا نلقي نظرة فاحصة على ما نفذناه للتو:

  • on_click_loadData () - نسمي وظيفة addTestData () ونستفيد من

وظيفة btn.clicked.connect ()

  • on_click_deleteData () - نسمي وظيفة deleteTestData () ونستخدمها

وظيفة btn.clicked.connect ()

  • randomValueGenerator () - تُرجع قيمة int عشوائية من النطاق المحدد
  • btn.clicked.connect () - نقوم بتوصيل الإشارة بالفتحة
  • w.show () - عرض القطعة
  • app.exec_ () -تنفيذ تطبيق

إجراءات DB

يحتاج تطبيقنا إلى إجراءات SQL مرتبطة بإجراءات الزر. سنستخدم موصل pyodbc للاتصال بـ SQL Server DB. أفترض أن مخطط قاعدة البيانات موجود بالفعل ولسنا بحاجة إلى إنشاء كائنات قاعدة بيانات مثل الجداول وما إلى ذلك.

أضف بيانات الاختبار

تأخذ الدالة addTestData القيم من واجهة المستخدم وتمررها إلى استعلام SQL. لكن دعنا ننتقل إلى الكود بالكامل:

  • فتح الاتصال بقاعدة بيانات خادم SQL بتحديد dbAddress
  • تعيين قيمة المعرف - إذا لم يكن معرف الجدول هو زيادة تلقائية ، فنحن بحاجة إلى معرفة القيمة التالية للمعرف المراد استخدامها
  • تعريف استعلام SQL. سنمرر بعض القيم من واجهة المستخدم.
 استيراد ملفات pyodbc
استيراد ConfigParser

config = ConfigParser.RawConfigParser ()
config.read ("../ resources / env.properties")
قائمة = []
تسجيل الدخول = 'myFancyLogin'

def addTestData (db، schema، Name {...}):
   محاولة:
      dbAddress = "برنامج التشغيل = {SQL Server} ؛ الخادم = localhost \ SQLEXPRESS ؛ 
                   قاعدة البيانات = "+ db +" ؛ Trusted_Connection = نعم ؛ 
                   ش ؛ pwd = "
      cnx = pyodbc.connect (dbAddress)
      cursor = cnx.cursor () + schema + "]. [المرشحين] ORDER BY ID 
            تنازلي "
      معرف = returnValue (cnx ، المؤشر ، معرف)
      المعرف = str (معرف + 1)

      المخطط = str (مخطط)

      testQuery = 'SELECT DB_NAME () AS [قاعدة البيانات الحالية] ؛'
      المرشحين = "INSERT INTO [" + المخطط + "]. [المرشحين]      
                    القيم ("+ معرف +" ، "" + الاسم + "'، {...}") "
      returnDBName (cnx ، cursor ، testQuery)

      list = [مرشحون]
      executeQuery (cnx، cursor، list)

   باستثناء pyodbc. الخطأ مثل e:
      طباعة (هـ)
      طباعة "أخطاء في وظيفة addTestData"
   آخر:
      cnx.close ()

كتلة التعليمات البرمجية 6. إضافة طريقة بيانات الاختبار

احذف بيانات الاختبار

تتم معالجة حذف بيانات الاختبار من خلال وظيفة deleteTestData (db ، المخطط). يحتوي على معلمتين فقط (ديسيبل ، مخطط). هذا يعني أننا نريد تنظيف الطاولة بأكملها دون حمل ما بداخلها.

 def deleteTestData (ديسيبل ، مخطط):
   محاولة:
      dbAddress = "برنامج التشغيل = {SQL Server} ؛ الخادم = localhost \ SQLEXPRESS ؛
                   قاعدة البيانات = "+ db +" ؛ Trusted_Connection = نعم ؛
                   ش ؛ pwd = "
      cnx = pyodbc.connect (dbAddress)
      المؤشر = cnx.cursor ()
 
      المخطط = str (مخطط)
 
      testQuery = 'SELECT DB_NAME () AS [قاعدة البيانات الحالية] ؛'
      المرشحين = "حذف من [" + مخطط + "]. [مرشحون]"
      المرشحين المعالجة = "حذف من 
                             ["+ مخطط +"]. [معالجة المرشحين] "
 
      returnDBName (cnx ، cursor ، testQuery)
 
      list = [مرشحون ، مرشحون معالجون]
      executeQuery (cnx، cursor، list)

   إلا:
      طباعة "أخطاء في وظيفة deleteTestData"
   آخر:
      cnx.close ()

كتلة التعليمات البرمجية 7. حذف طريقة بيانات الاختبار

Utils

وبعض الوظائف المستخدمة بواسطة addTestData () و deleteTestData ():

 def executeQuery (cnx، cursor، list):
   لأني في القائمة:
   cursor.execute (i)
   cnx.commit ()

def returnDBName (cnx ، cursor ، dbQuery):
   cursor.execute (dbQuery)
   القيمة = cursor.fetchone ()
   القيمة = القيمة [0]
   القيمة = str (القيمة)

كتلة التعليمات البرمجية 8. وظائف Util

ملف إكس

حاليًا ، يمكننا استخدام الكود الخاص بنا إذا تم تثبيت Python ويمكننا تجميع الكود ، ولكن ماذا لو أردنا فقط الحصول على ملف قابل للتنفيذ؟ تسمح مكتبة py2exe بإنشاء ملف قابل للتنفيذ من كود Python (Code Block 9):

 من distutils.core إعداد الاستيراد
استيراد py2exe
      
الإعداد (windows = [اسم الملف مع عنصر واجهة المستخدم] ،
   data_files = ملفات_البيانات ،
   الخيارات = {'py2exe': {
      "يشمل": ['sip']،
      "dll_excludes": ['MSVFW32.dll'،
      "AVIFIL32.dll" ،
      "AVICAP32.dll" ،
      "ADVAPI32.dll" ،
      "CRYPT32.dll" ،
      "WLDAP32.dll" ،
      "MSVCP90.dll"]
      }
   })

كود بلوك 9. إنشاء ملف. exe

النتائج

وها هي نتيجة عملنا. آمل أن تستمتع البرنامج التعليمي!