Python之使用xlrd库读取Excel数据
应用背景:在数据驱动、参数化和批量处理Excel数据时,需要先读取Excel数据给实际接口传参。下面看下如何使用Python的xlrd库读取Excel数据。
一、安装xlrd库
方法1:打开cmd命令行,在线安装xlrd库(需要配置好Python环境)
注意:因为python3对xlrd里面的迭代方法作了修改,所以最高版本只能安装1.2.0或安装1.2.0之前的版本。
安装方式1:pip install xlrd==1.2.0 or pip install xlrd==0.9.3
在线安装xlrd库命令
python环境配置,配置项如下:
C:\Python39
C:\Python39\Scripts
C:\Python39\Lib\site-packages
Python环境配置
方法2:在pycharm中,在线安装xlrd库
在pycharm选择版本安装
二、xlrd库使用
首先准备Excel数据文件,如下图:
login.xlsx文件
其次,在代码中实现,具体如下
#导入xlrd库
import xlrd
def get_excelData():
try:
#第一步打开Excel文件
current_file = xlrd.open_workbook("login.xlsx")
#第2步,获取工作表格名称
table = current_file.sheet_by_name("login")
#第3步, 获取工作表的行(即每行数据)
nrows = table.nrows
#第4步,当表格中每行数据大于1时,开始读取数据(即表格存在数据时,才去读取)
if nrows > 1:
# 获取第一行字段,作为每列数据的键,即key
keys = table.row_values(0)
#定义空列表用于存储读取的全部数据
listApiData = []
# 从第2行开始遍历数据
for rowls in range(1, nrows):
#遍历每行对应的数据
values = table.row_values(rowls)
# keys,values组合转换为字典
api_dict = dict(zip(keys, values))
#每次遍历的数据添加到列表
listApiData.append(api_dict)
#返回最终的列表数据
return listApiData
else:
print("表格数据为空!")
return None
except Exception as e:
print("读取Excel文件异常,请检查!")
打印输出结果:
all_data=get_excelData()
print("excel全部数据:\n {}".format(all_data))
读取全部数据
只读取字段为body下的数据
#只读取字段为body下的数据
for i in range(len(all_data)):
print(f"body数据: {all_data[i]['body']}")
只读取某个字段下的内容
三、在项目中应用
前面的方法我们都学会了,下面就可以结合unittest里面的数据驱动ddt或者pytest里面的方法parametrize()使用了
1.在unittest中使用(下面是部分代码,结合自己的项目修改)
#读取Excel测试数据
testData = ReadExcel(caseFile.autotest_file, "login").read_data()
@ddt
class TestOrderListQuery(unittest.TestCase):
'''用户登录接口'''
def setUp(self):
print("=========开始测试=========")
@data(*testData)
def test_login(self,loginData):
'''用户登录接口'''
rowNum = int(loginData['ID'][-3:])
#登录接口地址
logInUrl=Urls().loginUrl()
#接口请求
res = HttpHandle().post(url=logInUrl, data=loginData['body'], headers=logInHeader)
res_json=res.json()
Log.info(f"登录接口返回结果:{res.text}")
2.在pytest中使用(下面是部分代码,结合自己的项目修改)
#读取Excel测试数据
testData = ReadExcel(caseFile.alarm_checkfile, 'alert').read_data()
class TestAlertParamsCheck:
'''告警接口参数检查'''
@pytest.fixture()
@allure.title("前置方法")
def test_Login(self):
"""fixture method"""
print("==============test_Login OK===============")
res_json=200
assert res_json == 200
@pytest.mark.usefixtures("test_Login")
@pytest.mark.parametrize("params",testData,ids=[testData[i]['title'] for i in range(len(testData))])
@allure.step("pytest parametrize")
@allure.description("参数化验证多组用例{}".format("params"))
def test_alertParamsCheck(self,params):
title=params['title']
'''告警接口参数验证-{}'''.format(title)
rowNum = int(params['ID'][-3:])
Log.info("******* 正在执行用例 ->{0} *********".format(params['title']))
Log.info("请求方式: {0},请求URL: {1}".format(params['method'], str(params['url']).format(Urls().alertUrl())))
Log.info("接口请求参数: {}".format(params['params']))
# 发送请求
origin_data = params['params']
alert_res = HttpHandle().post(url=Urls().alertUrl(),data=origin_data,headers=header)
alert_res_json = alert_res.json()
Log.info("接口返回结果: {}".format(alert_res_json))
好啦,今天的内容就是这些,后续会继续分享接口测试工具相关的专题,希望对大家有所帮助!