本文首发于:行者AI
在软件测试中,为项目编写接口自动化用例已成为测试人员常驻的测试工作。本文以 python 为例,基于笔者曾使用过的三种用例数据读取方法:xlrd、pandas、yaml,下面简要地介绍下它们的使用方法及简单分析。
1. Python 第三方库 xlrd
xlrd 模块可用于读取 excel 文档,是一种最常用的用例读取方式,使用方式如下。以演示惯例---注册接口为例,首先新建一个 excel 文档,文档中自定义接口用例参数:
(以下 data 均为随机生成,不涉及任何系统)
python 已安装第三方库后,开始读取接口用例。本次为了方便演示,方法未进行封装。
xlrd 代码演示
以下为实例代码:
import unittest
import xlrd
# 打开接口用例excel文件
excel_data = xlrd.open_workbook('register.xlsx')
# 读取excel文件中存放用例的sheet页,命名无要求
sheet = excel_data.sheet_by_name('register')
print(sheet.nrows)
print(sheet.row_values(1))
# 将读取到的用例全部追加到data列表中
data = []
for i in range(1, sheet.nrows):
data.append(sheet.row_values(i))
print(data)
class register(unittest.TestCase):
def test_register_check(self):
pass
复制代码
执行 py 文件后,打印读取 data 列表,成功读取出 excel 文件中用例数据:
但是上面的方法会把整个 excel 文件的用例全部存放到一个列表中,数据取用不太方便。现在我们对数据进行拆分,结合 ddt 数据驱动方式,进行数据读取:
import unittest
import xlrd
from ddt import ddt,data,unpack
excel_data = xlrd.open_workbook('register.xlsx')
sheet = excel_data.sheet_by_name('register')
# print(sheet.nrows)
# print(sheet.row_values(1))
data_ = []
for i in range(1, sheet.nrows):
data_.append(sheet.row_values(i))
print(data_)
# 引入的装饰器@ddt;导入数据的@data;拆分数据的@unpack
@ddt
class register(unittest.TestCase):
@data(*data_)
@unpack
def test_register(self, title, data, check):
print(data)
if __name__ == '__main__':
unittest.main()
复制代码
通过 ddt 中的 data 及 unpack 方法,excel 文件中的每条数据都是一个单独的列表,更便于提供给接口测试用例使用:
xlrd 模块在接口自动化中的使用频率非常高,调用方法也非常简单。读取到 excel 测试用例后,还可以使用装饰器 DDT 进行数据拆分,使数据更加简化。
xlrd 适用于项目接口数据较少、接口字段不经常调整的项目。如果项目中,接口数量非常多,在编写接口用例时,存放用例的 excel 文件内容会不断扩充。测试用例的易读性和维护性都会成为后期测试工作的难题,影响测试效率。
2. Python 第三方库 pandas
pandas 是 python 的一个数据分析包,可帮助使用者处理大型数据集。使用 pandas 中的 DataFrame(二维的表格型数据结构)方法,即可获取到 excel 表格中的测试数据。pandas 与 xrld 一样,都可读取 excel 文件。
首先创建一个 excel 文件,存放测试数据:
pandas 代码演示
实例代码:
# 从excel文件中读取用例,name参数为sheet名称
def read_excel_data(inputdir,name):
dataframe = pandas.DataFrame(columns=['接口名','用例','请求地址','请求体','断言','协议','请求方式']) # 传入参数就是excel文件中的列名
try:
datafile = pandas.read_excel(inputdir,sheet_name=name)
dataframe = dataframe.append(datafile, ignore_index=True, sort=True)
except:
print("Warning:excel文件打开异常,请重试!")
To_list = dataframe.to_dict(orient='records') # 参数='records'时,转化后是 list形式
return To_list
复制代码
from common.data import read_excel_data
import pytest
def getdata(path):
getdata = read_excel_data(path, '编辑xx')
print(getdata)
path = r'..\common\接口用例文档.xlsx' # excel文件的路径,按实际项目结构指明
getdata(path)
复制代码
调用封装好的方法,成功读取到 excel 文件中的全部用例数据:
该方法与 xlrd 类似,也是通过读取二维表格中数据的方式,获取到我们所需接口用例。
通过 xlrd 等方法读取 excel 文件中的测试用例,是接口测试中比较主流的数据读取方式。但是通过上面的案例展示可以发现,如果 excel 文件中的数据越来越多,后期测试的维护成本是比较高的,同时表格格式在大篇幅数据中,也不方便阅读。这也是此类方法的一个弊端。
3. Python 第三方库 yaml
yaml 是一种用来写配置文件的序列化语言,文件格式输出可以是列表、字典,也支持嵌套。层级关系用空格区分,但不支持 tab 缩进。
破折号和空格( “ - ” ):列表格式
# 以下数据会以list形式被读取
- testapi
- url
- get
复制代码
常见的 yaml 格式:
冒号和空格( “ :” ) :字典格式
# 以下数据会以dict形式被读取
name: A
age: 1
spouse:
name: B
age: 2
slave:
- name: C # - 表示为列表
age: 3
- name1: D
age1: 4
复制代码
yaml 代码演示
读取 yaml 文件中的 dict 数据,代码如下:
import os
import yaml
class LoadTestData:
# 设置路径,获取yaml文件数据
def load_data(self, file_name):
yaml_path = os.path.join(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
'test_file'), file_name)
yaml_data = yaml.load(open(yaml_path), Loader=yaml.FullLoader)
# print(yaml_data)
return yaml_data
def get_yaml_data(api_file, api_name):
'''
获取yaml中 api_name的数据
:param api_file: api文件位置
:param api_name: api文件名称
:return: 文件数据
'''
data = LoadTestData().load_data(api_file)[api_name]
print(data)
return data
if __name__ == '__main__':
file_name = 'api_data.yaml'
api_name = 'test'
# LoadTestData().load_data(file_name)
get_yaml_data(file_name,api_name )
print('读取成功')
复制代码
请注意 yaml.load 在调用时,可能会因为 yaml 版本较高而提示异常。解决方法:指定 loader = yaml.FullLoader 可解决异常。
根据上面 yaml 的实际运用可以发现,相比 excel 表格存放的数据,yaml 可读性更好,而且 python 本身也支持新建 yaml 文件,与脚本语言的交互性更佳。对于不同的测试模块,也可以新建不同的 yaml 文件,实现了功能模块之间的测试数据隔离。
总结
测试中,不管是以 excel 表格存放数据还是 yaml 文件存放数据,都能做到快速集成组装测试数据。但 excel 表格存放数据过大时,有可读性降低及脚本执行时间较长等问题。yaml 拥有简洁、与 python 交互性高,可以把功能模板的测试数据相互隔离等优点。但也需要对 yaml 的写法规范有一些了解,才能正确使用。
本文只是基于 python 测试数据读取角度,进行一次简单的分享。如有不恰当之处,欢迎大家指正。
评论