测试人员使用的Python:小型C熊猫脚本如何帮助测试大型数据集

我是一个项目的测试人员,其本质是收集和存储各种数据,并在此基础上形成各种报告和文件上传。在生成此类报告时,要考虑大量的数据选择条件,因此在测试时,您必须处理数据库中的SQL查询。但是,要验证数据的正确选择并搜索多余/丢失的数据,通常这是不够的,因此我不得不为此寻找其他工具。

由于我已经掌握了一些基本的python知识,因此我决定尝试编写一些小的脚本,使我可以对现有数据进行处理,从而促进并加快测试过程。在本文中,我将告诉您它的来龙去脉。

设计脚本脚本


要编写脚本,您需要弄清楚脚本应该做什么,需要输入什么数据以及希望输出什么数据。

该场景的样本步骤:

  1. 我们得到一个包含某种格式数据的文件(或几个文件)
  2. 从一个或多个文件获取数据
  3. 我们选择必要的数据
  4. 我们对数据执行一些操作
  5. 如有必要,我们会将数据上传到Excel文件中(通常,这种格式最方便进行进一步的分析和存储)

然后,您需要考虑如何以及在何处获得输入。它可以是带有数据的手动创建的文件,可以将数据上传到UI到带有过滤器的文件中,可以使用另一个脚本来解析数据的文件,可以将SQL查询结果上传到数据库的文件(您可以将数据从数据库快速上传到csv文件),json -file或xml-file,以及从响应到API请求等的数据。

我们使用pandas和其他库在python中编写脚本


要使用python编写脚本您需要安装解释器和合适的IDE。最好为此项目创建一个单独的虚拟环境

我为脚本使用了不同的库,其中一些是内置的python库,有些需要另外安装:

  • pandas是用于数据分析的库。它允许您处理来自各种格式文件的数据,以及使用SQL查询直接从数据库接收数据。来自文件的数据被加载到数据框中(在视觉上与Excel中的表相同),并且数据已经可以执行不同的操作:类似于SQL中的join / union,将不同数据框中的数据组合在一起,选择所需的数据在某些条件下,比较数据帧不同列中的数据,等等。
  • 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中的联接或联合的模拟)进行组合或对其执行一些操作,例如删除重复项,删除某些单元格中具有空值的行,比较多列中的数据,选择所需的行/列等。在熊猫文档中阅读更多内容。

脚本使用选项


现在,我们打开测试仪的主要工具,并选择项目中的数据/功能,以验证哪些脚本有用。

为脚本创建了带有少量通过generateata生成的测试数据的文件。实际上,数据文件包含数万行和大量列。

方案1:

有三个csv格式的文件,其中包含数据。对于每条数据线,都有一个带有唯一标识符ID的字段。考虑到某些条件从这些文件中选择数据,并将其输入数据库中的表中,然后将这些数据以UI上表的形式显示在报告中。可以将UI上的数据上传到Excel文件。

假设从源文件中选择报表数据的条件如下:

  • 文件可以按ID重复,在报表中,具有相同标识符的记录仅应考虑一次(在这种情况下,我们只需从数据中选择具有该标识符的任何行)。
  • reg_date列单元格中数据缺失的行不应计算在内。
  • 实际上,可能存在更多的选择条件,也可以将数据与系统中已有的数据进行比较,并且报告中仅显示ID相交的数据,但是例如,我们将仅考虑上述两个条件。

测试人员的任务:检查是否从源文件中正确选择了带有必要对象的行,并且所有这些对象都显示在UI的报告中。

我们为脚本编写一个脚本:

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

在最终文件中,如果不同数据帧中的列名称重合,则数据将仅包含具有ID的一列,并且可能不清楚来自哪个文件的列/行。因此,我可以在文件中用不同的名称命名具有唯一标识符的列,或者在每个文件中添加一个单独的列“此类文件的行”并在其中添加“是”-然后,在分析生成的Excel文件时,方便地按此列进行过滤因为 它们始终包含一个值,并且通过它们进行过滤,您已经可以了解相应列中哪些数据有所不同。

从文件示例数据example1_csv_1.csv



示例数据从report_UI.xlsx文件:一个



python脚本如下所示:

#   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文件。

测试人员的任务:预先准备一个包含测试数据的文件,以验证是否正确更新了现有记录,并且如果标识符匹配则在数据库中将它们附加一个确认符号,并且正确创建了新记录,并且如果有这样的记录,则将它们标记为添加到数据库中标识符尚未。

我们为脚本编写一个脚本:

  • 我们将数据从分区表上载到UI上的Excel文件中(如果不可能的话,您始终可以从代码中使用的SQL查询结果中导出数据,以将数据输出到UI上的该表中)并将其中的数据填充到第一个数据框中。
  • 我们从第二个来源获取带有数据的json文件,并将其加载到第二个数据帧中。
  • (merge — outer join SQL) - - Excel-, . , , .

:

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

方案3

向系统API发出请求,以响应接收到json格式的对象数据。

测试人员的任务:将来自对API的响应的响应数据与数据库中SQL查询结果的数据进行比较。

我们为脚本编写一个脚本:

  • 我们在数据库中执行SQL查询,将查询结果中的数据导出到csv文件中,并将此数据加载到第一个数据帧中。
  • 我们将响应请求的数据保存到json文件中的API,然后将文件中的数据加载到第二个数据帧中。
  • 我们将两个接收到的数据帧中的数据(通过类比与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"
    },
...
]

python脚本如下所示:

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


局限性:

  • 使用行数非常多的文件时,您必须将它们分成单独的文件(在这里您需要尝试,我很少有超过30,000行的文件)。
  • 如果json文件具有多层对象/数据数组嵌套,则将从内部级别将它们作为对象/数组加载到单元格中,因此,使用带有熊猫的json文件仅适用于没有过多嵌套对象的数据/数组。
  • API SQL- , SQL- .

如果对API请求的响应以xml格式出现,则您首先需要使用ElementTree或其他库从xml文件中解析必要的数据,然后将其加载到数据框中。

场景4:

在UI上下载了一个包含对象数据的xml文件,该文件是在某些条件下(例如,考虑对象的状态,日期,年份或其他参数值)从数据库中的数据即时生成的。

测试人员的任务:将公司标签属性中xml文件中对象的唯一标识符id与数据库中SQL查询结果中的对象标识符进行比较。

我们为脚本编写一个脚本:

  • 我们将响应请求的数据保存到xml文件中的API,使用ElementTree库从该文件中获取必要的数据,然后将数据加载到第一个数据帧中。
  • 我们在数据库中执行SQL查询,将查询结果中的数据导出到csv文件中,并将此数据加载到第二个数据框中。
  • 我们通过唯一标识符将来自两个接收到的数据帧的数据(合并-与SQL中的外部联接类似)合并为一个新数据帧,并将数据从其中卸载到Excel文件中。
  • 接下来,打开结果文件并分析数据行。

从实例数据example4_csv.csv文件



例如从数据example4_xml.xml文件:一个



python脚本如下所示:

#   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

在UI上,该部分以表的形式显示有关对象的数据。可以将数据上传到Excel文件。

测试人员的任务:将分区表中的数据与下载到Excel文件中的数据进行比较。

我们为脚本编写一个脚本:

  • 我们要求开发人员使用负责将数据输出到UI上的分区表的代码在数据库中进行SQL查询。
  • 我们在数据库中执行此SQL查询,将数据上传到csv文件,然后将数据从其中加载到第一个数据帧中。
  • 我们将数据从分区表上传到UI上的Excel文件,并将数据从其中加载到第二个数据框中。
  • (merge — outer join SQL) - - Excel-, Excel.
  • - pandas, / -/Excel- .

:

  • , Excel- UI, , , .

同样,类似的脚本可以简单地用于将数据从json文件或csv文件传输到Excel文件。或者,您可以将某些列中的几个Excel文件中的数据合并,然后将它们上传到一个新的Excel文件中。

结论


这些只是如何使用python + pandas加快测试过程并查找错误的一些示例。实际上,pandas有更多处理数据的机会,您可以在此库的文档中阅读有关此内容的更多信息。

也许您的项目还有使用这些脚本的其他选项,本文将帮助您开始在测试人员的工作中使用它们。

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


All Articles