Python untuk tester: skrip panda c kecil membantu menguji dataset besar

Saya bekerja sebagai penguji pada suatu proyek, yang intinya adalah pengumpulan dan penyimpanan berbagai data dan pembentukan berbagai laporan dan unggahan file berdasarkan pada mereka. Saat membuat laporan seperti itu, sejumlah besar kondisi untuk pemilihan data diperhitungkan, dan karena itu, saat pengujian, Anda harus banyak bekerja dengan kueri SQL dalam database. Tetapi untuk memverifikasi pemilihan data yang benar dan mencari kelebihan / data yang hilang, ini sering tidak cukup, jadi saya harus mencari alat tambahan untuk ini.

Karena saya sudah memiliki beberapa pengetahuan dasar python, saya memutuskan untuk mencoba menulis skrip kecil yang memungkinkan saya untuk melakukan sesuatu dengan data yang ada dan dengan demikian memfasilitasi dan mempercepat proses pengujian. Dalam artikel ini saya akan memberi tahu Anda apa yang terjadi.

Merancang skrip skrip


Untuk menulis skrip, Anda perlu mencari tahu apa yang harus dilakukan skrip, data apa yang perlu diinput dan data apa yang diharapkan menjadi output.

Contoh langkah untuk skenario:

  1. Kami mendapatkan file dengan data dalam format tertentu (atau beberapa file)
  2. Dapatkan data dari file / file
  3. Kami memilih data yang diperlukan
  4. Kami melakukan beberapa operasi pada data
  5. Kami mengunggah data ke file Excel, jika perlu (biasanya format ini yang paling nyaman untuk analisis dan penyimpanan lebih lanjut)

Maka Anda perlu memikirkan bagaimana dan di mana Anda bisa mendapatkan input. Ini bisa berupa file yang dibuat secara manual dengan data, mengunggah data ke UI ke file dengan mempertimbangkan filter akun, file dengan penguraian data menggunakan skrip lain, file untuk mengunggah hasil kueri SQL ke database (Anda dapat dengan cepat mengunggah data ke file csv dari database), json -file atau xml-file dengan data dari respons terhadap permintaan ke API, dll.

Kami menulis skrip dengan python menggunakan panda dan perpustakaan lain


Untuk menulis skrip dengan python, Anda perlu menginstal juru bahasa dan IDE yang sesuai. Yang terbaik juga adalah menciptakan lingkungan virtual terpisah untuk proyek ini.

Saya menggunakan pustaka yang berbeda untuk skrip, beberapa di antaranya adalah pustaka python bawaan , beberapa perlu diinstal tambahan:

  • panda adalah perpustakaan untuk analisis data. Ini memungkinkan Anda untuk bekerja dengan data dari file berbagai format, serta menerima data langsung dari database menggunakan kueri SQL. Data dari file dimuat ke dalam bingkai data (secara visual tabel yang sama seperti di Excel), dengan data di mana Anda sudah dapat melakukan operasi yang berbeda: menggabungkan data dari berbagai kerangka data dengan analogi dengan bergabung / bergabung dalam SQL, pilih data yang Anda butuhkan dalam kondisi tertentu, bandingkan data di berbagai kolom bingkai data, dll.
  • openpyxl, xlrd - perpustakaan untuk bekerja dengan Excel.

Kerangka kerja skrip paling sederhana untuk bekerja dengan data dari file csv, json, Excel adalah sebagai berikut:

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

Dalam skrip ini, data dari file format yang diperlukan dimuat ke dalam bingkai data, data yang diperlukan dipilih dan beberapa operasi dilakukan pada mereka, maka data tersebut ditulis ke file Excel baru.

Jika Anda perlu bekerja dengan data yang diperoleh sebagai hasil dari query SQL ke database, Anda tidak bisa mengekspornya ke file csv, tetapi langsung memasukkannya ke dalam kerangka data dengan mengeksekusi query SQL dalam database dalam skrip itu sendiri:

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

Jika Anda perlu mendapatkan data dari file xml, maka Anda dapat menggunakan perpustakaan yang dirancang untuk ini. Saya menggunakan library bawaan ElementTree .

Ketika data diterima dalam bingkai data, Anda dapat segera menggabungkannya dengan data dari kerangka data lain (analog gabungan atau gabungan dalam SQL) atau melakukan beberapa operasi pada mereka, misalnya, menghapus duplikat, menghapus baris dengan nilai kosong di sel tertentu , bandingkan data dalam banyak kolom, pilih baris / kolom yang diinginkan, dll. Baca lebih lanjut di dokumentasi untuk panda.

Opsi Penggunaan Script


Dan sekarang kita menghidupkan alat utama tester dan memilih data / fitur pada proyek kami, untuk verifikasi yang mana skrip seperti itu akan berguna.

File dengan sejumlah kecil data uji yang dihasilkan menggunakan generateata dibuat untuk skrip . Pada kenyataannya, file data berisi puluhan ribu baris dan sejumlah besar kolom.

Skenario # 1

Ada tiga file dalam format csv dengan data. Untuk setiap baris data, ada bidang dengan id pengidentifikasi unik. Data dari file-file ini dipilih dengan mempertimbangkan kondisi tertentu dan dimasukkan ke dalam tabel dalam database, maka data ini ditampilkan dalam laporan dalam bentuk tabel di UI. Dimungkinkan untuk mengunggah data pada UI ke file Excel.

Misalkan syarat untuk memilih data untuk laporan dari file sumber adalah sebagai berikut:

  • File dapat memiliki duplikat oleh id, dalam laporan, catatan dengan pengidentifikasi yang sama harus diperhitungkan hanya sekali (dalam hal ini, kami cukup memilih salah satu baris dengan pengenal ini dari data).
  • Baris dengan data yang hilang di sel kolom reg_date tidak boleh dihitung.
  • Bahkan, mungkin ada lebih banyak kondisi pemilihan, data juga dapat dibandingkan dengan data yang sudah ada dalam sistem dan hanya data yang memotong dengan id akan ditampilkan dalam laporan, tetapi misalnya kita akan mempertimbangkan hanya dua kondisi yang ditunjukkan di atas.

Tugas penguji: Periksa bahwa garis-garis dengan objek yang diperlukan dipilih dengan benar dari file sumber dan bahwa semua objek ini ditampilkan dalam laporan di UI.

Kami membuat skrip untuk skrip:

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

Dalam file terakhir, data hanya akan berisi satu kolom dengan id, jika nama-nama kolom dalam bingkai data yang berbeda bertepatan, dan mungkin tidak jelas kolom / baris dari file mana. Oleh karena itu, saya memberi nama kolom dengan pengidentifikasi unik dengan nama yang berbeda di file, atau menambahkan kolom terpisah "Baris dari file ini dan itu" ke setiap file dan meletakkan "Ya" di dalamnya - kemudian, ketika menganalisis file Excel yang dihasilkan, lebih mudah untuk menyaring dengan kolom ini karena mereka selalu mengandung nilai dan, dengan memfilternya, Anda sudah bisa memahami data apa yang menyimpang di kolom terkait.

Contoh data dari file example1_csv_1.csv :



Contoh data dari file report_UI.xlsx :



Skrip python terlihat seperti ini:

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

Keterbatasan:

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

Skenario No. 2
Bagian ini berisi data dalam bentuk tabel untuk objek tertentu dari satu sumber. Sistem akan menerima data dari sumber kedua (integrasi) dan memperbarui data tabel yang ada dengan data ini. Setiap catatan dalam tabel adalah data untuk satu objek yang memiliki pengidentifikasi unik. Jika dari sumber baru, data suatu objek oleh pengidentifikasi bertepatan dengan data objek yang ada, maka semua bidang catatan yang ada diperbarui dengan data dari sumber baru (dikonfirmasi). Jika tabel belum memiliki objek dengan pengenal dari sumber kedua, maka catatan baru dibuat di tabel dengan data dari sumber baru. Data dari sistem kedua dapat diunggah ke file json terlebih dahulu.

Tugas penguji:Siapkan file dengan data untuk pengujian terlebih dahulu, untuk memverifikasi bahwa catatan yang ada diperbarui dengan benar dan mereka ditempelkan dengan tanda konfirmasi dalam database jika ada kecocokan dengan pengidentifikasi, dan catatan baru dibuat dengan benar dan mereka ditandai dengan tanda menambahkan ke database jika catatan dengan demikian pengenal belum.

Kami membuat skrip untuk skrip:

  • Kami mengunggah data dari tabel partisi ke file Excel di UI (jika ini tidak memungkinkan, Anda selalu dapat mengekspor data dari hasil kueri SQL yang digunakan dalam kode untuk menampilkan data ke tabel ini di UI) dan mengisi data dari itu ke dalam frame data pertama .
  • Kami mendapatkan file json dengan data dari sumber kedua dan memuatnya ke dalam frame data kedua.
  • (merge — outer join SQL) - - Excel-, . , , .

:

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

Skenario 3

Permintaan dibuat ke API sistem, sebagai respons terhadap data objek mana dalam format json yang diterima.

Tugas penguji: Bandingkan data dari respons terhadap permintaan ke API dengan data dari hasil kueri SQL dalam database.

Kami membuat skrip untuk skrip:

  • Kami mengeksekusi query SQL dalam database, mengekspor data dari hasil query ke file csv, memuat data ini ke dalam frame data pertama.
  • Kami menyimpan data dari respons terhadap permintaan ke API di file json, memuat data dari file ke dalam kerangka data kedua.
  • Kami menggabungkan data (gabungan - dengan analogi dengan gabungan luar dalam SQL) dari dua bingkai data yang diterima menjadi satu bingkai data baru dengan pengidentifikasi unik dan membongkar data dari data tersebut ke dalam file Excel, di mana kami akan membandingkan data dengan kolom menggunakan fungsi dari Unggul
  • Atau data pada kolom dalam bingkai data umum dapat dibandingkan menggunakan panda, saat menurunkan baris dengan data yang sama / berbeda dalam kolom ke dalam kerangka data baru / file Excel untuk analisis.

Contoh data dari file example3_csv.csv :



Contoh data dari file 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"
    },
...
]

Skrip python terlihat seperti ini:

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


Keterbatasan:

  • Ketika bekerja dengan file dengan jumlah baris yang sangat besar, Anda harus memecahnya menjadi file yang terpisah (di sini Anda perlu mencoba, saya jarang memiliki file lebih dari 30.000 baris).
  • Jika file json memiliki beberapa level nesting objek / array data, maka dari level internal mereka akan dimuat ke dalam sel sebagai objek / array, oleh karena itu bekerja dengan file json dengan panda hanya nyaman untuk data tanpa objek nesting objek yang berlebihan / array.
  • API SQL- , SQL- .

Jika respons terhadap permintaan terhadap API datang dalam format xml, maka Anda harus mengurai data yang diperlukan dari file xml menggunakan ElementTree atau pustaka lain dan kemudian memuatnya ke dalam bingkai data.

Skenario No. 4

Di UI file xml dengan data pada objek diunduh, yang dihasilkan dengan cepat dari data dalam subjek database dengan kondisi tertentu (misalnya, status, tanggal, tahun atau nilai parameter lainnya untuk objek diperhitungkan).

Tugas penguji: Bandingkan id pengidentifikasi unik objek dari file xml yang ada dalam atribut tag perusahaan dengan pengidentifikasi objek dari hasil kueri SQL dalam database.

Kami membuat skrip untuk skrip:

  • Kami menyimpan data dari respons terhadap permintaan ke API dalam file xml, mendapatkan data yang diperlukan dari file ini menggunakan pustaka ElementTree, memuat data ke dalam frame data pertama.
  • Kami mengeksekusi query SQL dalam database, mengekspor data dari hasil query ke file csv, memuat data ini ke dalam frame data kedua.
  • Kami menggabungkan data (gabungan - dengan analogi dengan gabungan luar dalam SQL) dari dua bingkai data yang diterima menjadi satu bingkai data baru dengan pengidentifikasi unik dan membongkar data dari data tersebut ke dalam file Excel.
  • Selanjutnya, buka file yang dihasilkan dan analisis jalur data.

Contoh data dari file example4_csv.csv :



Contoh data dari file example4_xml.xml :



Skrip python terlihat seperti ini:

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

Skenario 5

Di UI, bagian ini menampilkan data pada objek dalam bentuk tabel. Dimungkinkan untuk mengunggah data ke file Excel.

Tugas penguji: Bandingkan data dari tabel partisi dengan data yang diunduh ke file Excel.

Kami membuat skrip untuk skrip:

  • Kami meminta pengembang untuk kueri SQL dalam database dari kode yang bertanggung jawab untuk mengeluarkan data ke tabel partisi pada UI.
  • Kami menjalankan query SQL ini dalam database, mengunggah data ke file csv, memuat data dari itu ke dalam frame data pertama.
  • Kami mengunggah data dari tabel partisi ke file Excel di UI dan memuat data dari itu ke dalam kerangka data kedua.
  • (merge — outer join SQL) - - Excel-, Excel.
  • - pandas, / -/Excel- .

:

  • , Excel- UI, , , .

Juga, skrip yang sama dapat digunakan hanya untuk mentransfer data dari file json atau file csv ke file Excel. Atau, Anda dapat menggabungkan data dari beberapa file Excel di kolom tertentu dan mengunggahnya ke dalam satu file Excel baru.

Kesimpulan


Ini hanya beberapa contoh bagaimana Anda dapat menggunakan python + panda untuk mempercepat proses pengujian dan menemukan bug. Bahkan, panda memiliki lebih banyak peluang untuk bekerja dengan data, Anda dapat membaca lebih lanjut tentang ini di dokumentasi untuk pustaka ini.

Mungkin proyek Anda memiliki opsi lain untuk menggunakan skrip tersebut dan artikel ini akan membantu Anda mulai menggunakannya dalam karya penguji.

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


All Articles