我是一个项目的测试人员,其本质是收集和存储各种数据,并在此基础上形成各种报告和文件上传。在生成此类报告时,要考虑大量的数据选择条件,因此在测试时,您必须处理数据库中的SQL查询。但是,要验证数据的正确选择并搜索多余/丢失的数据,通常这是不够的,因此我不得不为此寻找其他工具。由于我已经掌握了一些基本的python知识,因此我决定尝试编写一些小的脚本,使我可以对现有数据进行处理,从而促进并加快测试过程。在本文中,我将告诉您它的来龙去脉。设计脚本脚本
要编写脚本,您需要弄清楚脚本应该做什么,需要输入什么数据以及希望输出什么数据。该场景的样本步骤:- 我们得到一个包含某种格式数据的文件(或几个文件)
- 从一个或多个文件获取数据
- 我们选择必要的数据
- 我们对数据执行一些操作
- 如有必要,我们会将数据上传到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文件中数据的最简单脚本框架如下:
import pandas as pd
df = pd.read_csv('./csv_file.csv', sep=';', encoding='utf-8')
writer = pd.ExcelWriter('.xlsx')
final_df.to_excel(writer, '1')
writer.save()
在此脚本中,将所需格式文件中的数据加载到数据框中,选择了必需的数据并对其进行了一些操作,然后将数据写入新的Excel文件中。如果您需要处理通过SQL查询而获得的数据到数据库,则不能将它们导出到csv文件,而是可以通过在脚本本身中在数据库中执行SQL查询来立即将它们放入数据框:
import pandas as pd
import psycopg2
conn = psycopg2.connect(dbname='_', host='', port='',
user='', password='')
q = """select ...
from ...
where ..."""
df = pd.read_sql_query(q, conn)
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脚本如下所示:
import pandas as pd
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'])
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)
df_from_csv = df_from_csv.dropna()
print(df_from_csv)
file_excel = 'report_UI.xlsx'
df_from_excel = pd.ExcelFile(file_excel).parse('1')
print(df_from_excel)
df = df_from_csv.merge(df_from_excel, left_on='id', right_on="", how='outer')
print(df)
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脚本如下所示:
import pandas as pd
df_from_csv = pd.read_csv('./example3_csv.csv', sep=';', encoding='utf-8')
print(df_from_csv)
df_from_json = pd.read_json('./example3_json.json', encoding='utf-8')
print(df_from_json)
df_csv_json = df_from_csv.merge(df_from_json, left_on='id',
right_on="id", how='outer')
print(df_csv_json)
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脚本如下所示:
from xml.etree import ElementTree
import pandas as pd
tree = ElementTree.parse("example4_xml.xml")
root = tree.getroot()
data_list = []
i = 1
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
df_from_xml = pd.DataFrame.from_dict(data_list, orient='columns')
print(df_from_xml)
df_from_csv = pd.read_csv('./example4_csv.csv', sep=';', encoding='utf-8')
print(df_from_csv)
df = df_from_csv.merge(df_from_xml, left_on='id', right_on="id", how='outer')
print(df)
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- .
:同样,类似的脚本可以简单地用于将数据从json文件或csv文件传输到Excel文件。或者,您可以将某些列中的几个Excel文件中的数据合并,然后将它们上传到一个新的Excel文件中。结论
这些只是如何使用python + pandas加快测试过程并查找错误的一些示例。实际上,pandas有更多处理数据的机会,您可以在此库的文档中阅读有关此内容的更多信息。也许您的项目还有使用这些脚本的其他选项,本文将帮助您开始在测试人员的工作中使用它们。