Python للاختبار: كيف تساعد البرامج النصية c الباندا الصغيرة في اختبار مجموعات البيانات الكبيرة

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

نظرًا لأن لدي بالفعل بعض المعرفة الأساسية في الثعبان ، فقد قررت أن أحاول كتابة نصوص صغيرة تسمح لنا بعمل شيء بالبيانات الموجودة وبالتالي تسهيل وتسريع عملية الاختبار. في هذه المقالة سأخبركم بما حدث.

تصميم نص برمجي


لكتابة برنامج نصي ، تحتاج إلى معرفة ما يجب أن يفعله البرنامج النصي بالضبط ، وما هي البيانات التي يجب إدخالها وما هي البيانات المتوقع إخراجها.

خطوات نموذجية للسيناريو:

  1. نحصل على ملف ببيانات بتنسيق معين (أو عدة ملفات)
  2. احصل على بيانات من ملف / ملفات
  3. نختار البيانات اللازمة
  4. نقوم ببعض العمليات على البيانات
  5. نقوم بتحميل البيانات إلى ملف Excel ، إذا لزم الأمر (عادة ما يكون هذا التنسيق هو الأكثر ملاءمة لمزيد من التحليل والتخزين)

ثم تحتاج إلى التفكير في كيفية ومكان الحصول على المدخلات. يمكن أن يكون هذا ملفًا تم إنشاؤه يدويًا مع البيانات ، وتحميل البيانات إلى واجهة مستخدم في ملف مع مراعاة عوامل التصفية ، وملف مع تحليل البيانات باستخدام برنامج نصي آخر ، وملف لتحميل نتائج استعلام SQL إلى قاعدة البيانات (يمكنك تحميل البيانات بسرعة إلى ملف csv من قاعدة البيانات) ، json -ملف أو ملف XML مع بيانات من الاستجابة لطلب API ، إلخ.

نكتب نصوصًا في الثعبان باستخدام الباندا والمكتبات الأخرى


لكتابة البرامج النصية في python ، تحتاج إلى تثبيت مترجم IDE مناسب. من الأفضل أيضًا إنشاء بيئة افتراضية منفصلة لهذا المشروع.

أستخدم مكتبات مختلفة للنصوص البرمجية ، بعضها مكتبات بيثون مدمجة ، وبعضها يحتاج إلى التثبيت بالإضافة إلى:

  • الباندا هي مكتبة لتحليل البيانات. يسمح لك بالعمل مع البيانات من ملفات بتنسيقات مختلفة ، وكذلك تلقي البيانات مباشرة من قاعدة البيانات باستخدام استعلام SQL. يتم تحميل البيانات من الملفات في إطارات البيانات (بشكل مرئي نفس الجداول الموجودة في Excel) ، مع البيانات التي يمكنك بالفعل تنفيذ عمليات مختلفة: دمج البيانات من إطارات البيانات المختلفة عن طريق القياس مع الانضمام / الاتحاد في SQL ، حدد البيانات اللازمة في ظل ظروف معينة ، قارن البيانات في أعمدة مختلفة من إطار البيانات ، إلخ.
  • openpyxl، xlrd - مكتبات للعمل مع Excel.

أبسط إطار عمل نصي للعمل مع البيانات من ملفات csv و json و Excel هو كما يلي:

#   pandas
import pandas as pd

#    csv-  -
# (        )
#       csv-     ";"
df = pd.read_csv('./csv_file.csv', sep=';', encoding='utf-8')

# 
#    json-  -
# (        )
# df = pd.read_json('./json_file.json', encoding='utf-8')

# 
#    Excel-  -,     
# (        )
# file_excel = 'Excel_file.xlsx'
# df = pd.ExcelFile(file_excel).parse('1')


#  -     -  
#    - final_df


#    Excel-,  
#          
# (      )
writer = pd.ExcelWriter('.xlsx')
final_df.to_excel(writer, '1')
writer.save()

في هذا البرنامج النصي ، يتم تحميل البيانات من ملف بالتنسيق المطلوب في إطار بيانات ، ويتم تحديد البيانات الضرورية ويتم تنفيذ بعض العمليات عليها ، ثم تتم كتابة البيانات إلى ملف Excel جديد.

إذا كنت بحاجة إلى العمل مع البيانات التي تم الحصول عليها نتيجة لاستعلام SQL إلى قاعدة البيانات ، فلا يمكنك تصديرها إلى ملف csv ، ولكن يمكنك الحصول عليها على الفور في إطار بيانات عن طريق تنفيذ استعلام SQL في قاعدة البيانات في البرنامج النصي نفسه:

#   pandas
import pandas as pd
#      ,     PostgreSQL
# (   -    )
import psycopg2

#    
conn = psycopg2.connect(dbname='_', host='', port='',
                        user='', password='')

#   SQL-
q = """select ... 
    from ... 
    where ..."""

#    -,  SQL-
df = pd.read_sql_query(q, conn)


#  -     -  
#    - final_df


#    Excel-,  
#          
# (      )
writer = pd.ExcelWriter('.xlsx')
final_df.to_excel(writer, '1')
writer.save()

إذا كنت بحاجة إلى الحصول على بيانات من ملف xml ، فيمكنك استخدام المكتبات المصممة لذلك. أستخدم مكتبة ElementTree المضمنة .

عند تلقي البيانات في إطار بيانات ، يمكنك دمجها على الفور مع بيانات من إطار بيانات آخر (نظائر الانضمام أو الاتحاد في SQL) أو إجراء بعض العمليات عليها ، على سبيل المثال ، إزالة التكرارات ، وإزالة الصفوف بقيم فارغة في خلايا معينة ، ومقارنة البيانات في أعمدة متعددة ، حدد الصفوف / الأعمدة المطلوبة ، إلخ. اقرأ المزيد في وثائق الباندا.

خيارات استخدام البرنامج النصي


والآن نقوم بتشغيل الأداة الرئيسية للاختبار ونختار البيانات / الميزات في مشروعنا ، للتحقق من أن هذه البرامج النصية ستكون مفيدة.

الملفات مع كمية صغيرة من بيانات الاختبار تم إنشاؤها باستخدام generatedata تم إنشاء البرامج النصية . في الواقع ، تحتوي ملفات البيانات على عشرات الآلاف من الصفوف وعدد كبير من الأعمدة.

السيناريو رقم 1

هناك ثلاثة ملفات بتنسيق csv مع البيانات. لكل خط بيانات ، يوجد حقل بمعرف معرف فريد. يتم تحديد البيانات من هذه الملفات مع مراعاة شروط معينة وإدخالها في جدول في قاعدة البيانات ، ثم يتم عرض هذه البيانات في تقرير في شكل جدول على واجهة المستخدم. من الممكن تحميل البيانات على واجهة المستخدم إلى ملف Excel.

افترض أن شروط اختيار البيانات لتقرير من ملفات المصدر هي كما يلي:

  • يمكن أن تحتوي الملفات على تكرارات حسب المعرف ، في تقرير ، يجب أخذ سجل بنفس المعرف في الاعتبار مرة واحدة فقط (في هذه الحالة ، نختار ببساطة أيًا من الصفوف التي تحتوي على هذا المعرف من البيانات).
  • لا يجب حساب الصفوف التي تحتوي على بيانات مفقودة في خلية عمود reg_date.
  • في الواقع ، يمكن أن يكون هناك المزيد من شروط الاختيار ، كما يمكن مقارنة البيانات بالبيانات الموجودة بالفعل في النظام وسيتم عرض البيانات المتقاطعة فقط حسب المعرّف في التقرير ، ولكن على سبيل المثال ، سنأخذ في الاعتبار الشرطين فقط المشار إليهما أعلاه.

مهمة المختبر: تحقق من تحديد الخطوط التي تحتوي على الكائنات الضرورية بشكل صحيح من الملفات المصدر ومن عرض جميع هذه الكائنات في التقرير على واجهة المستخدم.

نقوم بتأليف نص للبرنامج النصي:

  • - csv-, - ( union SQL), id, reg_date.
  • UI Excel-, , -.
  • (merge) - ( outer join SQL) Excel- .
  • , , - , , UI.

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

مثال بيانات من ملف example1_csv_1.csv :



مثال بيانات من ملف report_UI.xlsx :



يبدو نص بايثون كما يلي:

#   pandas
import pandas as pd

#     csv-    -
# (        )
df_from_file1 = pd.read_csv('./example1_csv_1.csv', sep=';', encoding='utf-8',
                            usecols=['id', 'name', 'email', 'reg_date'])
df_from_file2 = pd.read_csv('./example1_csv_2.csv', sep=';', encoding='utf-8',
                            usecols=['id', 'name', 'email','reg_date'])
df_from_file3 = pd.read_csv('./example1_csv_3.csv', sep=';', encoding='utf-8',
                            usecols=['id', 'name', 'email', 'reg_date'])

#    -    - 
# (   union  SQL)
df_from_csv = pd.concat([df_from_file1, df_from_file2, df_from_file3]).\
    reset_index(drop=True)
print(df_from_csv)

#       
df_from_csv.drop_duplicates(subset='id', keep='first', inplace=True)
print(df_from_csv)

#     NaN ( )   reg_date
df_from_csv = df_from_csv.dropna()
print(df_from_csv)

#    Excel-   UI  -,
#       
# (        )
file_excel = 'report_UI.xlsx'
df_from_excel = pd.ExcelFile(file_excel).parse('1')
print(df_from_excel)

#  -     - 
# -       UI
# (   outer join  SQL)
df = df_from_csv.merge(df_from_excel, left_on='id', right_on="", how='outer')
print(df)

#     Excel-
writer = pd.ExcelWriter('.xlsx')
df.to_excel(writer, '1')
writer.save()

محددات:

  • ( , 30 000 ).
  • ( Excel) / , .

السيناريو رقم 2
يحتوي القسم على بيانات في شكل جدول لكائنات معينة من مصدر واحد. سيستقبل النظام البيانات من مصدر ثانٍ (تكامل) وتحديث بيانات الجدول الحالية بهذه البيانات. كل سجل في الجدول هو بيانات لكائن واحد له معرف فريد. إذا كانت بيانات الكائن من خلال المعرف تتوافق من مصدر جديد مع بيانات كائن موجود ، يتم تحديث جميع حقول السجل الحالي ببيانات من المصدر الجديد (مؤكد). إذا لم يكن للجدول بعد كائن بمعرف من المصدر الثاني ، فسيتم إنشاء سجل جديد في الجدول مع بيانات من المصدر الجديد. يمكن تحميل البيانات من النظام الثاني إلى ملف json مقدمًا.

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

نقوم بتأليف نص للبرنامج النصي:

  • نقوم بتحميل البيانات من جدول الأقسام إلى ملف Excel على واجهة المستخدم (إذا لم يكن ذلك ممكنًا ، يمكنك دائمًا تصدير البيانات من نتيجة استعلام SQL المستخدم في التعليمات البرمجية لإخراج البيانات إلى هذا الجدول في واجهة المستخدم) وملء البيانات منه في إطار البيانات الأول .
  • نحصل على ملف json مع البيانات من المصدر الثاني وتحميله في إطار البيانات الثاني.
  • (merge — outer join SQL) - - Excel-, . , , .

:

  • ( , 30 000 ).
  • json- / – /, - json- pandas /.

السيناريو 3

يتم تقديم طلب إلى واجهة برمجة تطبيقات النظام ، استجابةً لاستقبال البيانات الموجودة على الكائنات بتنسيق json.

مهمة المختبر: قارن البيانات من الاستجابة للطلب إلى API مع البيانات من نتيجة استعلام SQL في قاعدة البيانات.

نقوم بتأليف نص للبرنامج النصي:

  • نقوم بتنفيذ استعلام SQL في قاعدة البيانات ، وتصدير البيانات من نتيجة الاستعلام إلى ملف csv ، وتحميل هذه البيانات في إطار البيانات الأول.
  • نقوم بحفظ البيانات من الاستجابة للطلب على API في ملف json ، وتحميل البيانات من الملف في إطار البيانات الثاني.
  • نقوم بدمج البيانات (الدمج - عن طريق القياس مع الربط الخارجي في SQL) من إطارين للبيانات المستلمة في إطار بيانات جديد بواسطة معرف فريد ونفريغ البيانات منه في ملف Excel ، حيث سنقوم بالفعل بمقارنة البيانات بالأعمدة باستخدام وظائف التفوق
  • أو يمكن مقارنة البيانات الموجودة على الأعمدة في إطار البيانات العام باستخدام الباندا ، أثناء تفريغ الصفوف بالبيانات نفسها / المختلفة في الأعمدة في إطار بيانات / ملف Excel جديد للتحليل.

بيانات مثال من ملف example3_csv.csv :



مثال بيانات من ملف example3_json.json :

[
    {
        "id": "16421118-4116",
        "name_json": "Tempor Consulting",
        "email_json": "Nullam.lobortis.quam@***",
        "tel_json": "1-821-805-****",
        "reg_date_json": "12-11-16",
        "city_json": "Natales"
    },
    {
        "id": "16040210-2206",
        "name_json": "Odio Etiam Incorporated",
        "email_json": "arcu@***",
        "tel_json": "1-730-291-****",
        "reg_date_json": "26-06-05",
        "city_json": "Viddalba"
    },
...
]

يبدو نص بايثون كما يلي:

#   pandas
import pandas as pd

#    csv-  -
# (        )
#       csv-     ";"
df_from_csv = pd.read_csv('./example3_csv.csv', sep=';', encoding='utf-8')
print(df_from_csv)

#    json-  -
# (        )
df_from_json = pd.read_json('./example3_json.json', encoding='utf-8')
print(df_from_json)

#  -    -
# (   outer join  SQL)
df_csv_json = df_from_csv.merge(df_from_json, left_on='id', 
                                right_on="id", how='outer')
print(df_csv_json)

#    Excel-,   ,
#      -   ,
#          
# (      )
# writer = pd.ExcelWriter('.xlsx')
# df_csv_json.to_excel(writer, '1')
# writer.save()

#       
# (, name_csv  name_json) 
#       Excel-  
# (        )
unequal_data_df = df_csv_json.loc[df_csv_json['name_csv'] != 
                                  df_csv_json['name_json']]
unequal_data_df = unequal_data_df[['id', 'name_csv', 'name_json']]
print(unequal_data_df)

writer = pd.ExcelWriter('_name.xlsx')
unequal_data_df.to_excel(writer, '1')
writer.save()


محددات:

  • عند العمل مع الملفات التي تحتوي على عدد كبير جدًا من الأسطر ، سيتعين عليك تقسيمها إلى ملفات منفصلة (هنا تحتاج إلى المحاولة ، نادرًا ما يكون لدي ملفات تزيد عن 30000 سطر).
  • إذا كان ملف json يحتوي على عدة مستويات من تداخل صفائف الكائنات / البيانات ، فمن المستويات الداخلية سيتم تحميلها في الخلية ككائن / صفيف ، وبالتالي فإن العمل مع ملفات json مع الباندا يعد ملائمًا فقط للبيانات دون تداخل مفرط للكائنات / صفائف.
  • API SQL- , SQL- .

إذا كانت الاستجابة لطلب API تأتي بتنسيق xml ، فستحتاج أولاً إلى تحليل البيانات الضرورية من ملف xml باستخدام ElementTree أو مكتبة أخرى ثم تحميلها في إطار البيانات.

السيناريو رقم 4

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

مهمة المختبر: قارن معرف المعرفات الفريدة للكائنات من ملف xml الموجودة في سمة علامة الشركة مع معرفات الكائنات من نتيجة استعلام SQL في قاعدة البيانات.

نقوم بتأليف نص للبرنامج النصي:

  • نقوم بحفظ البيانات من الاستجابة لطلب API في ملف xml ، والحصول على البيانات اللازمة من هذا الملف باستخدام مكتبة ElementTree ، وتحميل البيانات في إطار البيانات الأول.
  • نقوم بتنفيذ استعلام SQL في قاعدة البيانات ، وتصدير البيانات من نتيجة الاستعلام إلى ملف csv ، وتحميل هذه البيانات في إطار البيانات الثاني.
  • نقوم بدمج البيانات (دمج - مشابه للانضمام الخارجي في SQL) من إطارين للبيانات المستلمة في إطار بيانات جديد بواسطة معرف فريد ونقوم بإلغاء تحميل البيانات منه في ملف Excel.
  • بعد ذلك ، افتح الملف الناتج وقم بتحليل خطوط البيانات.

مثال للبيانات من ملف example4_csv.csv :



مثال للبيانات من ملف example4_xml.xml :



يبدو نص بايثون كما يلي:

#   ElementTree
from xml.etree import ElementTree
#   pandas
import pandas as pd

#    xml-   
# (        )
tree = ElementTree.parse("example4_xml.xml")

#   
root = tree.getroot()

#  ,     
data_list = []
i = 1

#    -   id_type1  id_type2
for child in root.iter("companies"):
    for child_1 in child.iter("company"):
            data_list.append({"": i, "id": child_1.get("id_type1")
                                                or child_1.get("id_type2"), 
                              "  xml": ""})
            i += 1

#     data_list  -
df_from_xml = pd.DataFrame.from_dict(data_list, orient='columns')
print(df_from_xml)

#    csv-  -
df_from_csv = pd.read_csv('./example4_csv.csv', sep=';', encoding='utf-8')
print(df_from_csv)

#  -   -
# (   outer join  SQL)
df = df_from_csv.merge(df_from_xml, left_on='id', right_on="id", how='outer')
print(df)

#    Excel-
#          
# (      )
writer = pd.ExcelWriter('.xlsx')
df.to_excel(writer, '1')
writer.save()

السيناريو 5

في واجهة المستخدم ، يعرض القسم بيانات عن الكائنات في شكل جدول. من الممكن تحميل البيانات إلى ملف Excel.

مهمة المختبر: قارن البيانات من جدول الأقسام مع البيانات التي تم تنزيلها إلى ملف Excel.

نقوم بتأليف نص للبرنامج النصي:

  • نطلب من المطورين استعلام SQL في قاعدة البيانات من الكود المسؤول عن إخراج البيانات إلى جدول الأقسام في واجهة المستخدم.
  • نقوم بتنفيذ استعلام SQL هذا في قاعدة البيانات ، ونقوم بتحميل البيانات إلى ملف csv ، وتحميل البيانات منه في إطار البيانات الأول.
  • نقوم بتحميل البيانات من جدول الأقسام إلى ملف Excel على واجهة المستخدم وتحميل البيانات منه في إطار البيانات الثاني.
  • (merge — outer join SQL) - - Excel-, Excel.
  • - pandas, / -/Excel- .

:

  • , Excel- UI, , , .

أيضًا ، يمكن استخدام نصوص مشابهة لنقل البيانات من ملفات json أو ملفات csv إلى ملفات Excel. أو يمكنك دمج البيانات من عدة ملفات Excel في أعمدة معينة وتحميلها في ملف Excel جديد.

استنتاج


هذه ليست سوى أمثلة قليلة لكيفية استخدام python + pandas لتسريع عملية الاختبار والعثور على الأخطاء. في الواقع ، لدى الباندا المزيد من الفرص للعمل مع البيانات ، يمكنك قراءة المزيد حول هذا في وثائق هذه المكتبة.

ربما يحتوي مشروعك على خيارات أخرى لاستخدام مثل هذه البرامج النصية وستساعدك هذه المقالة على البدء في استخدامها في عمل المختبرين.

Source: https://habr.com/ru/post/undefined/


All Articles